Heim Java JavaBase So dekompilieren Sie Java

So dekompilieren Sie Java

Dec 07, 2019 pm 03:06 PM
java

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;
        }
    }
}
Nach dem Login kopieren

Führen Sie Folgendes aus zwei Befehle:

javac Decompilation.java
javap -c Decompilation.class
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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;
        }
    }
}
Nach dem Login kopieren

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");
            }
        }
    }
}
Nach dem Login kopieren
Nach dem Login kopieren

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");
            }
        }
    }
}
Nach dem Login kopieren
Nach dem Login kopieren

--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:

So dekompilieren Sie Java

JadClipse

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:

So dekompilieren Sie Java

So dekompilieren Sie JavaNachdem 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 Tutorial

.

Das obige ist der detaillierte Inhalt vonSo dekompilieren Sie Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

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

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

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

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

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.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

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

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

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.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

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

Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

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.

Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

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

Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Oct 13, 2024 pm 01:32 PM

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.

See all articles