HOWTO · Java

Java-Klasse dekompilieren

Erfahren Sie, wie Sie Java-.class-Dateien und JARs mit Eclipse, IntelliJ IDEA, Kommandozeilen-Decompilern und JD-GUI untersuchen.

Auf dieser Seite

Um kompilierten Java-Code zu untersuchen, öffnen Sie eine eigenständige .class-Datei in einer IDE oder einem Decompiler, oder durchsuchen Sie ein .jar-Archiv mit einem Tool, das Archive unterstützt. Eclipse IDE mit Enhanced Class Decompiler (ECD) und IntelliJ IDEA können rekonstruierten Quellcode anzeigen; JD-CLI und FernFlower bieten Kommandozeilen-Workflows, während JD-GUI eine durchsuchbare Oberfläche bereitstellt. Das Dekompilieren hilft, Verhalten zu erklären, wenn der Quellcode nicht verfügbar ist, kann das Original aber nicht exakt wiederherstellen: Kommentare und Formatierung fehlen im Bytecode, und Namen oder Struktur können abweichen.
Dekompilieren ist eines der Themen auf Klassenebene im Java-Tutorial, in der Gruppe zu Klassen und Methoden.

Gründe für das Dekompilieren einer Java-Klasse

Eine kompilierte .class-Datei enthält Java-Bytecode für eine Klasse. Eine .jar-Datei ist ein Archiv, das Klassendateien, Bilder, Konfiguration und andere Ressourcen enthalten kann. Sie können ein Archiv mit ZIP-Tools auflisten oder extrahieren; das Dekompilieren ist nützlich, wenn Sie lesbaren Code für eine seiner kompilierten Klassen benötigen.

Entwickler untersuchen kompilierte Klassen üblicherweise, um eine Bibliothek zu verstehen, ein Verhalten zu analysieren oder zu prüfen, was gepackt wurde. Wählen Sie eine IDE, wenn Sie bereits in einer arbeiten, einen Kommandozeilen-Decompiler, wenn Sie Dateien wiederholbar verarbeiten müssen, oder JD-GUI, wenn Sie Klassen interaktiv durchsuchen möchten. In der Regel benötigen Sie Zugriff auf die Datei und ein Tool, das ihr Format lesen kann; dass eine Datei ein JAR ist, bedeutet für sich genommen nicht, dass sie zugriffsbeschränkt ist.

Java-Decompiler

Ein Java-Decompiler analysiert Bytecode und rekonstruiert quellcodeähnlichen Java-Code. Das Ergebnis ist eine Annäherung, keine Wiederherstellung des Quellprojekts. Der Compiler entfernt normalerweise Kommentare und Quellformatierung. Je nach Compileroptionen und verfügbaren Debug-Metadaten können auch lokale Variablennamen und Zeileninformationen fehlen. Ein JAR ist ein Archiv von Dateien, während eine .class-Datei eine einzelne kompilierte Klasse ist; ein Decompiler kann je nach Tool beides akzeptieren.

Für eine schnelle Untersuchung verwenden Sie IntelliJ IDEA oder Eclipse IDE. Für einen Terminal-Workflow verwenden Sie JD-CLI oder FernFlower. Um ein JAR zu durchsuchen und Klassen in einem Fenster auszuwählen, verwenden Sie JD-GUI. Die Übersicht zu Java-Decompilern liefert weiteren Kontext zu den Tools.

Java-Klasse mit Eclipse IDE dekompilieren

Installieren Sie das Plug-in Enhanced Class Decompiler (ECD) aus dem Eclipse Marketplace und verknüpfen Sie anschließend Klassendateien mit dessen Editor:

  • Öffnen Sie Help und wählen Sie Eclipse Marketplace. Suchen Sie nach Enhanced Class Decompiler und folgen Sie den Installationsanweisungen.
  • Öffnen Sie Window > Preferences und wählen Sie dann General > Editors > File Associations.
  • Wählen Sie den Dateityp *.class. Wählen Sie in der Liste der zugeordneten Editoren den ECD-Decompiler-Editor und legen Sie ihn als Standard fest, wenn Klassendateien dort geöffnet werden sollen.
  • Übernehmen Sie die Einstellung und öffnen Sie dann eine .class-Datei im Project- oder Package-Explorer.

Die Menübezeichnungen können zwischen Eclipse-Versionen leicht abweichen. Wenn die Datei in einem anderen Editor geöffnet wird, kehren Sie zu File Associations zurück und prüfen Sie, ob der Decompiler-Editor für *.class-Dateien ausgewählt ist.

Java-Klasse mit IntelliJ IDEA dekompilieren

IntelliJ IDEA kann dekompilierten Quellcode für Klassendateien anzeigen, die es auflösen kann, einschließlich Klassen in Bibliotheken. Öffnen Sie die Klasse aus der Project-Ansicht oder navigieren Sie über den Namen zu ihr; die IDE zeigt eine rekonstruierte Quellansicht. Das ist nützlich für eine Untersuchung ohne separate Decompiler-Einrichtung. Der angezeigte Code stammt weiterhin aus Bytecode und ist nicht die ursprüngliche Quelldatei.

Java-Klasse über die Kommandozeile dekompilieren

Kommandozeilen-Decompiler sind nützlich, wenn Sie eine bekannte Eingabedatei oder ein Archiv verarbeiten möchten. Installieren Sie eine kompatible Java-Laufzeit und beziehen Sie das Tool von seinem Projekt. Prüfen Sie die mit der jeweiligen Version ausgelieferte Bedienungsanleitung: Befehlssyntax, Optionen und akzeptierte Eingabeformen können zwischen Builds abweichen. Hier ist kein toolspezifischer Befehl angegeben, da für die genannten Versionen kein Aufruf verifiziert wurde.

JD-CLI verwenden

JD-CLI ist ein Java-Decompiler für die Kommandozeile. Geben Sie die Pfade zur ausführbaren Datei und zur Eingabe an und verwenden Sie dann die Ausgabeoption, die in der Dokumentation Ihrer heruntergeladenen Version beschrieben ist. Prüfen Sie in der Hilfe oder Dokumentation dieser Version, ob sie eine eigenständige Klasse, ein JAR oder beides akzeptiert und wohin sie den rekonstruierten Quellcode schreibt. Laden Sie JD-CLI von intoolswetrust/jd-cli herunter und folgen Sie der Bedienungsdokumentation für diesen Build.

FernFlower verwenden

FernFlower ist ein weiterer Java-Decompiler. Geben Sie den Decompiler, eine Quellklasse oder ein Archiv sowie ein Zielverzeichnis in der Syntax an, die für Ihren Build dokumentiert ist. Prüfen Sie, ob diese Version eine eigenständige Klasse ebenso wie ein JAR akzeptiert und ob sie zusätzliche Einstellungen erfordert. Auch hier ist kein verifizierter FernFlower-Aufruf angegeben.

Der FernFlower-Spiegel enthält Projekt- und Build-Informationen. Ein Quellcode-Checkout kann zum Erstellen eine kompatible Gradle-Einrichtung erfordern; für die routinemäßige Untersuchung verwenden Sie eine gepackte Version, wenn das Projekt eine bereitstellt. Build- und Decompiler-Befehle hängen von der gewählten Version und der lokalen Java-/Gradle-Installation ab und werden daher hier nicht als verifizierte Ausführungsschritte dargestellt.

Java-Klasse mit JD-GUI dekompilieren

JD-GUI ist ein grafischer Java-Decompiler zum Öffnen von Klassendateien und Durchsuchen von Klassen in JAR-Archiven. Laden Sie eine kompatible Version von der JD-GUI-Projektseite herunter. Öffnen Sie eine .class-Datei oder ein JAR über die Dateiauswahl der Anwendung und wählen Sie dann im Navigationsbereich eine Klasse aus, um ihren rekonstruierten Quellcode zu untersuchen. Die genauen Menüs variieren je nach Version.

Dieses vollständige Java-Programm gibt eine Begrüßung aus und eignet sich zum Kompilieren, bevor Sie seine Klassendatei in JD-GUI öffnen.

public class Example1 {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

Seine Standardausgabe lautet:

Hello World

Wenn Sie die kompilierte Klasse untersuchen, zeigt JD-GUI den Parameter args möglicherweise unter einem anderen Namen, etwa paramArrayOfString, und lässt Quellkommentare weg. Kommentare und Formatierung werden in gewöhnlichem Klassen-Bytecode nicht gespeichert. Debug-Metadaten können, sofern vorhanden, einige Namen oder Zeileninformationen erhalten; die Verwendung eines Debuggers während der Kompilierung macht eine Klasse für sich genommen nicht besser lesbar. Betrachten Sie rekonstruierten Code als Leitfaden für das Verhalten und ziehen Sie den Originalquellcode zu Rate, wenn es auf exakte Kommentare, Namen oder Projektstruktur ankommt.