itemis Blog

4+1 = CAFEBABE: Java Bytecode in Eclipse

Geschrieben von Arne Deutsch | 08.08.2017

Was treiben Itemiker eigentlich an ihrem projektfreien 4+1-Tag? Sie bilden sich weiter, häufig mit der Arbeit an eigenen Ideen – und genau solch ein Projekt möchte ich heute vorstellen. Das Ziel war, sich in Xtext und Xtend einzuarbeiten. Herausgekommen ist dabei ein auf diesen Technologien aufbauender Java-ByteCode-Editor (JBC-Editor).


Nun ist Xtext vor allem ein eclipse-basiertes Framework, um textuelle DSLs zu erstellen und das Tooling dafür zu generieren, während der Java Bytecode, abgelegt in .class-Dateien, binär ist. Was zuerst einmal wie out-of-scope wirkt, ist mit ein oder zwei Kniffen recht leicht zusammen zu bekommen.

Ohne hier zu sehr ins Detail gehen zu wollen: Der wichtigste Teil ist das Ersetzen des IDocumentProviderdes Editors. Dieser konvertiert die Binärdaten beim Lesen in Text und beim Schreiben zurück ins Binärformat. In einem weiteren Artikel gehe ich ein wenig mehr auf die Technik ein und heute bei der Benutzung und Funktionalität des Java-Bytecode-Editors an sich bleiben.

Motivation

Aber warum sollte man sich für den Inhalt der .class-Dateien interessieren und den Editor nutzen? Zugegeben, in den meisten Projekten ist der Java-Code interessant, nicht was der Compiler daraus macht. Aber es gibt durchaus Fälle, in denen ein guter Viewer und unter Umständen ein Editor für die Binärdaten hilfreich sein kann.

Wer seinen eigenen Compiler schreibt oder eine Sprache für die Java Virtual Machine (JVM) entwirft, welche nach Bytecode compiliert, der wird vermutlich davon profitieren, wenn er sich den Output seines Tools komfortabel ansehen kann. Den selben Anwendungsfall mag es bei Tool-Herstellern geben, welche Bytecode instrumentieren, um zum Beispiel Tracing oder Profiling zu ermöglichen.

Für denjenigen, der an Frameworks arbeitet, die dynamisch Bytecode erstellen, kann es hilfreich sein, sich den Code von vorhandenen Klassen anzuschauen – oder auch manuell zu modifizieren, um die Effekte direkt und live zu beobachten, bevor sie in Code gegossen werden.
Und last but not least mag der eifrige Student, der vielleicht ein wenig tiefer in die Technik schauen möchte, es interessant und lehrreich finden, wie die JVM seinen Code zu Gesicht bekommt.

Installation das Bytecode-Editors

Um sich selbst einen Eindruck von den Möglichkeiten zu machen, ist es vermutlich am besten, den Java-Bytecode-Editor zu installieren und auszuprobieren. Einfach in Eclipse folgende Update-Site eingeben (unter Help -> Install New Software...):

    http://download.itemis.com/jbc/updates/


das JBC-Feature installieren und die Lizenz (EPL) und den Neustart bestätigen.


Öffnen des Editors

Um die zu einer .java-Datei  zugehörige .class-Datei zu öffnen, gibt es im Package und Project Explorer einen Eintrag Open JBC im Kontextmenü. Das Ausführen dieser Aktion öffnet direkt einen neuen Editor, der dann den Bytecode als DSL darstellt.



Natürlich kann eine
.class-Datei auch direkt mit einem Editor geöffnet werden. Das geschieht wie in Eclipse üblich über das Kontextmenü Open With -> JBC Editor.


Bearbeiten des Bytecodes

Der Editor stellt jedes Byte als hexadezimale Zahl dar. Die einzige Ausnahme bilden UTF8-Strings, die wie in Java dargestellt werden. Dies dient vor allem der leichten Editierbarkeit. Das Ändern eines String-Wertes ist damit so leicht wie im Java-Code. Diese Daten werden mit Schlüsselwörtern und gruppierenden Klammern angereichert, um die Bedeutung hervorzuheben. Die Darstellung entspricht so direkt dem, was man aus der Java-Spec über das ClassFile-Format nachlesen kann.

Innerhalb des Codes kann generell mit F3 / Ctrl + Click navigiert werden. Auf diese Weise kann man den Referenzen, repräsentiert in den meisten Fällen durch zwei Bytes, leicht nachgehen. Wenn Occurrence Marking aktiviert, ist wird das Ziel unter dem Cursor farblich hervorgehoben.


Im Bytecode kommt vor jeder Tabelle zuerst einmal die Länge dieser Tabelle. Demzufolge muss diese Länge auch angepasst werden, wenn im Editor Einträge gelöscht werden oder hinzukommen. Daher bietet der Editor entsprechende Validierungen, die die Längen der Tabellen mit den angegebenen Längen vergleichen. Wenn sie nicht stimmen werden sie als Fehler hervorgehoben und können per Quick Fix (
Ctrl + 1) angepasst werden.



Für ein besseres Verständnis des Bytecodes können Hover-Informationen und die Outline sorgen. Die Elemente aus dem Editor werden hier noch einmal dargestellt, allerdings mit aufgelösten Referenzen und interpretierten Werten. So werden zum Beispiel die Access-Modifier der Klasse textuell und nicht wie im Editor als hexadezimale Zahl im Editor dargestellt.


Um ein erstes Gefühl für den Editor zu bekommen, schlage ich folgende Aufgabe vor:

  1. Erstelle ein “Hello World”-Programm
  2. Führe es aus und beobachte die Ausgabe
  3. Öffne den JBC-Editor
  4. Ändere die Konstante mit dem Ausgabetext
  5. Speichere den JBC-Editor
  6. Führe die Run-Configuration noch einmal aus und beobachte die Ausgabe

Der Sourcecode

Mit Hilfe von Xtext war dieses Projekt zügig umgesetzt. Es gibt noch viele Features, die man sich wünschen würde: Mehr Validierungen, eine bessere Autocompletion, Templates, Refactorings, einen Formatter und vieles mehr. Und all diese Dinge lassen sich mit begrenztem Aufwand hinzufügen – auf jeden Fall mit bedeutend weniger Aufwand als wenn man mit Plain Java ein Eclipse-Plugin schreiben würde.

Und wenn du jetzt Appetit bekommen hast, dann kannst du dir natürlich auch den Sourcecode auf GitHub anschauen.

Übrigens: Mehr zu unserem 4+1-Arbeitszeitmodell gibt's bei uns im Blog.