2009-06-13 8 views
1

Ich habe ein Programm, in dem einige Java-Klassen verfügbar sind. Es ist möglich, sie zu dekompilieren? Ist es möglich, den Quellcode einer Klasse zu ändern und neu zu kompilieren, ohne alle anderen .class Dateien zu haben?Java-Klasse dekompilieren und neu kompilieren

Nehmen wir zum Beispiel an, ich habe eine dog.class Datei, die eine Unterklasse von Tier implementieren, die in animal.class definiert ist.

  • Kann ich dog.java ohne animal.class neu kompilieren?
  • Kann ich ohne animal.java neu kompilieren?

Ich bin kein Java-Entwickler, also bitte korrigieren Sie mich, wenn ich keinen Sinn mache.

Antwort

3

Sie finden die class Datei benötigen, um tatsächlich die Klasse zu verwenden, aber Das bedeutet nicht, dass Sie die Quelldatei benötigen.

Werfen wir einen Blick auf die Möglichkeiten mit den Klassen Dog und Animal Klasse. Unter der Annahme, dass die Dog Klasse eine Unterklasse der Animal Klasse ist, können wir folgendes tun:

  • Wenn Sie sowohl Animal.class und Animal.java haben, können Sie eine Dog Klasse. Wenn Sie Animal.class haben, aber nicht Animal.java, können Sie eine Dog Klasse erstellen. Wenn Sie Animal.class nicht haben, aber Animal.java haben, können Sie eine Dog Klasse machen. (Das bedeutet, dass die Animal.java-Datei kompiliert werden müssen, wenn die Dog.java Datei kompiliert wird.)

  • Wenn Sie nicht haben, entweder Animal.class noch Animal.java, können Sie keine Dog Klasse.

Hier ist eine tabellarische Version des obigen:

 
Have Animal.java?  Have Animal.class?  Can make Dog class? 
-----------------  ------------------  ------------------- 
     Yes     Yes   -->   Yes 
     Yes     No   -->   Yes 
     No      Yes   -->   Yes 
     No      No   -->   No 

Wenn Sie die class Datei haben, gibt es Programme, die die class Datei dekompilieren kann eine menschenlesbare java Quelldatei zu erzeugen, jedoch Es wird nicht die genaue Quelle wiederherstellen, die zur Erstellung der Datei class verwendet wurde.

Wenn jedoch in diesem Fall nur die Klasse Animal um eine neue Dog Klasse erweitert werden muss, ist der Quellcode selbst nicht erforderlich.

Denken Sie daran - immer wenn eine Klasse in Java erstellt wird, wird die Klasse Object immer erweitert. Auch wenn wir keinen Zugriff auf den Quellcode der Klasse Object haben, können wir eigene Klassen erstellen, da wir Zugriff auf die Object.class in Java haben.

Dieser Fall ist ähnlich - solange wir die class Datei für eine Klasse haben, können wir es in vollem Umfang verwenden. Das einzige, was fehlt, ist die eigentliche Implementierung, die im Quellcode aufgeführt ist.

1

In der Regel keine. Sie könnten jedoch Stubs für diese fehlenden Klassen erstellen (nur für das Kompilieren) und dann im Original ersetzen, wenn Sie sie haben.

1

Wenn Sie Zugang zu einer kompilierten Klasse (animal.class in Ihrem Beispiel) haben dann Sie können neu kompilieren eine Unterklasse (dog.java) (Sie müssen nicht, müssen jedoch den Zugriff auf den Quellcode haben die Oberklasse).

Wenn Sie nicht einmal Zugriff auf die kompilierte Superklasse haben, können Sie einen entsprechenden Stub der Superklasse erstellen, wenn Sie die relevanten Methoden kennen (die implementiert oder aus der Unterklasse aufgerufen werden) .

An einem gewissen Punkt, aber Sie werden eine echte Version des kompilierten Super benötigen Sie den Code zu ermöglichen, korrekt auszuführen ...

0

Nur um die anderen Antworten hinzuzufügen, ein Aspekt, den Sie möglicherweise beachten sollten, ist, dass wenn Ihre Klasse komplexe Strukturen hat, der Decompiler möglicherweise nicht in der Lage ist, sie in einen "rekompilierbaren" Zustand zu dekompilieren bearbeite es manuell.

0

Wenn Sie die Klasse ausführen und dekompilieren können, verfügen Sie über die erforderlichen Klassen zum Kompilieren der überarbeiteten Java-Datei (wenn Sie sie in Ihren Klassenpfad einschließen).

Beachten Sie, dass Ihre neue Klassendatei in "Front" der ursprünglichen Klassen auf dem Klassenpfad sein muss, um wirksam zu werden.

Beachten Sie auch, dass "versiegelte JAR-Dateien" diesen Trick nicht erlauben, Klassen zu ändern.

+0

Sie benötigen keine anderen Klassen zum Dekompilieren. – shodanex

0

Meine 2 Cent: Einige Dekompilierer verhindern, dass Klassen auf physikalischer Ebene dekompiliert werden (z. B. werden Sie während des Dekompilierungsprozesses auf einigen Decompilern abstürzen). Zusätzliches Problem, dass ich mit Decompilern traf, nur wenige von ihnen unterstützt Anmerkungen. In meinem Fall, wenn ich versuche, eine Klasse zu dekompilieren, habe ich einen Deadlock: Code enthält Annotation, kann aber ohne Crash nur durch decompiler dekompiliert werden, die Annotation nicht unterstützt.