Wie kann ich Java .class-Dateien für Menschen lesbar öffnen?

111

Ich versuche herauszufinden, was die Klassendatei eines Java-Applets unter der Haube tut. Wenn Sie es mit Notepad oder Textpad öffnen, wird nur ein Haufen Gobbledy-Gook angezeigt.

Gibt es eine Möglichkeit, es wieder in ein etwas lesbares Format zu bringen, damit ich versuchen kann, herauszufinden, was es tut?

  • Umgebung == Windows mit VS 2008 installiert.
cpuguru
quelle
7
Nur eine semantische Sache, sollte es nicht eins = nicht zwei sein? == ist eine Frage, während = eine Aussage ist und Sie eine Aussage über Ihre Umgebung machen.
icco
Können Sie diese Frage klären? Mein unmittelbarer Gedanke war, dass Sie den tatsächlichen Bytecode lesen wollten, aber es scheint, dass Sie tatsächlich den Code eines anderen dekompilieren möchten.
Outlaw Programmer
12
@icco, = bedeutet Zuweisung, == bedeutet Gleichheit. Er sagt, dass (Umgebung == Windows mit installiertem VS2008) wahr ist, und gibt keinen Befehl, die Umgebung auf Windows mit installiertem VS2008 einzustellen. Mann, der offtopisch und nerdig war.
Blorgbeard ist
7
Für den Datensatz == erklärt keine Gleichheit; es testet die Gleichheit. Sie können true == false schreiben, und es ist ungefähr so ​​aussagekräftig wie das Schreiben von Environment == Windows mit installiertem VS 2008, dh überhaupt nicht aussagekräftig.
bwerks

Antworten:

208

jd-gui ist momentan der beste Dekompiler. Es kann neuere Funktionen in Java verarbeiten, verglichen mit dem immer staubigen JAD.

DarenW
quelle
Wie aktuell ist diese Antwort im Jahr 2020?
Der Coding Wombat
Solange der Link irgendwohin führt, ist er wohl gut. Ich würde nicht wissen, ob es jetzt einen besseren Java-Dekompiler gibt, da ich Java seit langer Zeit nicht mehr verwendet habe.
DarenW
77

Wenn es Ihnen nichts ausmacht, Bytecode zu lesen, sollte Javap einwandfrei funktionieren. Es ist Teil der Standard-JDK-Installation.

Usage: javap <options> <classes>...

where options include:
   -c                        Disassemble the code
   -classpath <pathlist>     Specify where to find user class files
   -extdirs <dirs>           Override location of installed extensions
   -help                     Print this usage message
   -J<flag>                  Pass <flag> directly to the runtime system
   -l                        Print line number and local variable tables
   -public                   Show only public classes and members
   -protected                Show protected/public classes and members
   -package                  Show package/protected/public classes
                             and members (default)
   -private                  Show all classes and members
   -s                        Print internal type signatures
   -bootclasspath <pathlist> Override location of class files loaded
                             by the bootstrap class loader
   -verbose                  Print stack size, number of locals and args for methods
                             If verifying, print reasons for failure
Michael Myers
quelle
9

Verwenden Sie, wie von @MichaelMyers hervorgehoben

javap -c <name of java class file> 

um den JVM-Assemblycode abzurufen. Sie können die Ausgabe zur besseren Sichtbarkeit auch in eine Textdatei umleiten.

javap -c <name of java class file> > decompiled.txt
Nilashish C.
quelle
7

Wenn Sie einen Java-Dekompiler javapbenötigen , können Sie dazu das Befehlszeilentool verwenden . Außerdem beschreibt Java Decompiler HOW-TO , wie Sie eine Klassendatei dekompilieren können.

Drew Frezell
quelle
2

Was Sie suchen, ist ein Java-De-Compiler. Ich empfehle JAD http://www.kpdus.com/jad.html. Es ist kostenlos für nichtkommerzielle Zwecke und erledigt die Arbeit.

Hinweis: Dadurch wird der Code nicht exakt mit dem geschrieben, was geschrieben wurde. Das heißt, Sie verlieren Kommentare und möglicherweise Variablennamen, sodass es etwas schwieriger wird, als nur normalen Quellcode zu lesen. Wenn der Entwickler wirklich geheim ist, hat er auch seinen Code verschleiert, was das Lesen noch schwieriger macht.

David Beleznay
quelle
2

cpuguru, wenn Ihr Applet mit Javac 1.3 (oder weniger) kompiliert wurde, ist die beste Option die Verwendung von Jad.

Leider ist das letzte von JAD 1.5.8 (14. April 2001) unterstützte JDK JDK 1.3.

Wenn Ihr Applet mit einem neueren Compiler kompiliert wurde, können Sie JD-GUI ausprobieren : Dieser Dekompiler befindet sich in der Entwicklung, generiert jedoch meistens korrekte Java-Quellen für Klassen, die mit den JDKs 1.4, 1.5 oder 1.6 kompiliert wurden.

DarenW, danke für deinen Beitrag. JD-GUI ist noch nicht der beste Dekompiler ... aber ich arbeite daran :)

Emmanuel Dupuy
quelle
2

Die Dekompilierung mit Jad ist wahrscheinlich die beste Option. Wenn der Code nicht verschleiert wurde, wird ein gutes Ergebnis erzielt.

Rasmus Faber
quelle
1

Sie müssen einen Dekompiler verwenden. Andere haben JAD vorgeschlagen, es gibt andere Möglichkeiten, JAD ist die beste.

Ich werde die Kommentare wiederholen, die Sie im Vergleich zum ursprünglichen Quellcode möglicherweise etwas verlieren. Es wird besonders lustig aussehen, wenn der Code aufgrund der Löschung Generika verwendet.

Zac Gochenour
quelle
1

Natürlich das JAD- und / oder JADclipse Eclipse-Plugin.

John Gardner
quelle
1

Wenn die Klassendatei, in die Sie schauen möchten, Open Source ist, sollten Sie sie nicht dekompilieren, sondern die Quelldateien direkt an Ihre IDE anhängen. Auf diese Weise können Sie den Code einer Bibliotheksklasse einfach so anzeigen, als wäre es Ihr eigener

arturh
quelle
0

Wie vorgeschlagen können Sie JAD verwenden, um es zu dekompilieren und die Dateien anzuzeigen. Um das Lesen zu vereinfachen, können Sie das JADclipse-Plugin für Eclipse verwenden, um JAD direkt in Eclipse zu integrieren, oder den DJ Java Decompiler verwenden, der viel einfacher zu verwenden ist als Befehlszeilen-JAD


quelle
0

JAD ist eine hervorragende Option, wenn Sie als Ergebnis lesbaren Java-Code wünschen. Wenn Sie sich jedoch wirklich mit den Interna des .classDateiformats befassen möchten, werden Sie es wollen javap. Es ist im JDK enthalten und ermöglicht es Ihnen, den hexadezimalen Bytecode in lesbares ASCII zu "dekompilieren". Die Sprache, die es erzeugt, ist immer noch Bytecode (nichts wie Java), aber es ist ziemlich lesbar und äußerst lehrreich.

Wenn Sie wirklich wollen, können Sie auch jede .classDatei in einem Hex-Editor öffnen und den Bytecode direkt lesen. Das Ergebnis ist identisch mit der Verwendung javap.

Daniel Spiewak
quelle
0

Applet.class muss nicht dekompiliert werden. Der Quellcode der öffentlichen Java-API-Klassen wird mit dem JDK geliefert (falls Sie ihn installieren möchten) und ist besser lesbar als dekompilierter Bytecode. Sie finden komprimiert in src.zip (in Ihrem JDK-Installationsordner).

Arno
quelle