So dekompilieren Sie Java
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:
Installieren 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!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen





Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

Java ist eine beliebte Programmiersprache, die sowohl von Anfängern als auch von erfahrenen Entwicklern erlernt werden kann. Dieses Tutorial beginnt mit grundlegenden Konzepten und geht dann weiter zu fortgeschrittenen Themen. Nach der Installation des Java Development Kit können Sie das Programmieren üben, indem Sie ein einfaches „Hello, World!“-Programm erstellen. Nachdem Sie den Code verstanden haben, verwenden Sie die Eingabeaufforderung, um das Programm zu kompilieren und auszuführen. Auf der Konsole wird „Hello, World!“ ausgegeben. Mit dem Erlernen von Java beginnt Ihre Programmierreise, und wenn Sie Ihre Kenntnisse vertiefen, können Sie komplexere Anwendungen erstellen.
