Der Prozess der Dekompilierung ist genau das Gegenteil der Kompilierung, bei der die kompilierte Programmiersprache in ihren unkompilierten Zustand zurückversetzt wird, also der Quellcode der Programmiersprache ermittelt wird. Es geht darum, die Sprache, die die Maschine verstehen kann, in die Sprache umzuwandeln, die der Programmierer verstehen kann. Dekompilierung in der Java-Sprache bezieht sich im Allgemeinen auf die Konvertierung von Klassendateien in Java-Dateien.
Häufig verwendete Java-Dekompilierungstools
In diesem Artikel werden hauptsächlich vier Java-Dekompilierungstools vorgestellt: javap, jad und cfr sowie das visuelle Dekompilierungstool JD-GUI
JAVAP
Javap ist ein Tool, das mit JDK geliefert wird. Es kann den Code dekompilieren und den vom Java-Compiler generierten Bytecode anzeigen. Der größte Unterschied zwischen Javap und den beiden anderen Dekompilierungstools besteht darin, dass die von ihm generierten Dateien keine Java-Dateien sind und nicht so leicht zu verstehen sind wie die von den beiden anderen Tools generierten Codes. Nehmen wir als Beispiel einen einfachen Code. Wenn wir beispielsweise analysieren möchten, wie Switch in Java 7 String unterstützt, können wir zunächst den folgenden Quellcode kompilieren und übergeben:
public class switchDemoString { public static void main(String[] args) { String str = "world"; switch (str) { case "hello": System.out.println("hello"); break; case "world": System.out.println("world"); break; default: break; } } }
Führen Sie Folgendes aus zwei Befehle:
javac Decompilation.java javap -c Decompilation.class
Der generierte Code lautet wie folgt:
Compiled from "Decompilation.java" public class Decompilation { public Decompilation(); Code: 0: aload_0 1: invokespecial #8 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: ldc #16 // String world 2: astore_1 3: aload_1 4: dup 5: astore_2 6: invokevirtual #18 // Method java/lang/String.hashCode:()I 9: lookupswitch { // 2 99162322: 36 113318802: 48 default: 82 } 36: aload_2 37: ldc #24 // String hello 39: invokevirtual #26 // Method java/lang/String.equals:(Ljava/lang/Object;)Z 42: ifne 60 45: goto 82 48: aload_2 49: ldc #16 // String world 51: invokevirtual #26 // Method java/lang/String.equals:(Ljava/lang/Object;)Z 54: ifne 71 57: goto 82 60: getstatic #30 // Field java/lang/System.out:Ljava/io/PrintStream; 63: ldc #24 // String hello 65: invokevirtual #36 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 68: goto 82 71: getstatic #30 // Field java/lang/System.out:Ljava/io/PrintStream; 74: ldc #16 // String world 76: invokevirtual #36 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 79: goto 82 82: return }
javap dekompiliert den Bytecode nicht in eine Java-Datei, sondern generiert einen Bytecode, den wir verstehen können. Tatsächlich sind die von Javap generierten Dateien immer noch Bytecodes, aber Programmierer können sie etwas besser verstehen. Wenn Sie über Bytecode-Kenntnisse verfügen, können Sie den obigen Code trotzdem verstehen. Tatsächlich geht es darum, String in Hashcode umzuwandeln und dann zu vergleichen.
JAD
JAD ist ein relativ gutes Dekompilierungstool. Solange Sie ein Ausführungstool herunterladen, können Sie Klassendateien dekompilieren. Immer noch der obige Quellcode, der Inhalt nach der Dekompilierung mit Jad ist wie folgt:
Befehl: jad.exe Decompilation.class generiert eine Decompilation.jad-Datei
Das Ergebnis der JAD-Dekompilierung ist wie folgt folgt:
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.kpdus.com/jad.html // Decompiler options: packimports(3) // Source File Name: Decompilation.java package com.yveshe; import java.io.PrintStream; public class Decompilation { public Decompilation() { } public static void main(String args[]) { String str = "world"; String s; switch((s = str).hashCode()) { default: break; case 99162322: if(s.equals("hello")) System.out.println("hello"); break; case 113318802: if(s.equals("world")) System.out.println("world"); break; } } }
Sehen Sie sich den obigen Code an. Ist das nicht der Standard-Java-Quellcode? Dies zeigt deutlich, dass der ursprüngliche String-Schalter über die Methoden equal() und hashCode() implementiert wird.
CFR
JAD ist sehr nützlich, aber leider wurde es schon lange nicht mehr aktualisiert, sodass ich nur ein neues Tool verwenden kann, um es zu ersetzen Eine gute Wahl, im Vergleich zu JAD ist seine Syntax vielleicht etwas komplizierter, aber glücklicherweise kann er verwendet werden.
CFR wird moderne Java-Funktionen dekompilieren – Java 8 Lambdas (Java in Java und frühere Versionen Beta 103) , Java 7 String wurde dekompiliert, aber CFR ist vollständig in Java 6 geschrieben.
Es wird empfohlen, die Datei Decompilation.class manuell über den Befehl javac Decompilation.java zu kompilieren und zu generieren und sie dann zu testen.
Das Ergebnis der erfolgreichen Dekompilierung ist wie folgt:
/* * Decompiled with CFR 0_125. */ package com.yveshe; import java.io.PrintStream; public class Decompilation { public static void main(String[] args) { String str; String s = str = "world"; switch (s.hashCode()) { default: { break; } case 99162322: { if (!s.equals("hello")) break; System.out.println("hello"); break; } case 113318802: { if (!s.equals("world")) break; System.out.println("world"); } } } }
Im Vergleich zu Jad hat CFR viele Parameter und es ist immer noch derselbe Code. Wenn wir den folgenden Befehl verwenden, lautet das Ausgabeergebnis different:
E :CRF>java -jar cfr_0_125.jar Decompilation.class
/* * Decompiled with CFR 0_125. */ package com.yveshe; import java.io.PrintStream; public class Decompilation { public static void main(String[] args) { String str; String s = str = "world"; switch (s.hashCode()) { default: { break; } case 99162322: { if (!s.equals("hello")) break; System.out.println("hello"); break; } case 113318802: { if (!s.equals("world")) break; System.out.println("world"); } } } }
--decodestringswitch bedeutet, die Details der Switch-Unterstützungszeichenfolge zu dekodieren.
Ähnliche sind --decodeenumswitch, --decodefinally, --decodelambdas usw.
--decodelambdas kann Lambda-Ausdrücke dekompilieren.
JD-GUI
JD-GUI ist ein in C++ entwickeltes Java-Dekompilierungstool, das von Pavel Kouznetsov entwickelt wurde und die Plattformen Windows, Linux und Apple Mac OS unterstützt. Und stellt das Plug-in JD-Eclipse unter der Eclipse-Plattform bereit. JD-GUI basiert auf der Open-Source-Lizenz GPLv3 und ist für den persönlichen Gebrauch völlig kostenlos. Die Hauptaufgabe von JD-GUI besteht darin, visuelle Operationen bereitzustellen. Sie können Dateien direkt in das Fenster ziehen. Das Rendering erfolgt wie folgt:
JadClipseInstallieren Sie das Jad-Plugin in Eclipse. Beachten Sie, dass hier das Jad-Plugin installiert wird, nicht das Jd-Plugin~
Erforderliche Ressourcen: net.sf.jadclipse_3.3.0 .jar-Plug-in-JAR und JAD.exe-Dekompilierungssoftware (am Ende des Artikels finden Sie eine Download-Adresse)
Die Download-Adresse von JadClipse dient zum Herunterladen des JAR-Pakets des Plug-ins von der offiziellen Website , und platzieren Sie dann das JAR-Paket im Plugins-Verzeichnis von Eclipse; öffnen Sie Eclipse->Window->Preferences->. Zu diesem Zeitpunkt werden Sie feststellen, dass es eine weitere JadClipse-Option als zuvor gibt wie unten gezeigt:
Nachdem die Grundkonfiguration abgeschlossen ist, können wir die Standardöffnungsmethode für Klassendateien festlegen:
Eclipse->Fenster->Einstellungen->Allgemein->Editoren->Dateizuordnungen Wir können sehen, dass es zwei Möglichkeiten gibt, Klassendateien zu öffnen. Stellen Sie zunächst den Klassendatei-Viewer ein, der mit JadClipse und Eclipse geliefert wird hier, und JadClipse ist die Standardeinstellung.
Alle Konfigurationen sind abgeschlossen. Wählen Sie die Klasse aus, die Sie anzeigen möchten, und drücken Sie F3, um den Quellcode anzuzeigen. Setzen Sie ihn einfach auf die Standardeinstellung .
Mehr Weitere Java-Kenntnisse finden Sie in der Spalte
Java Basic TutorialDas obige ist der detaillierte Inhalt vonSo dekompilieren Sie Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!