2016-03-31 10 views
1

ich durch das Lesen im Internet herausgefunden, dass javaMit javap zum Lesen des Bytecode

public class Test { 
    private String s = "TESTTEST"; 
} 

zu

rechts
public class Test { 
    private String s; 

    public Test() { 
     s = "TESTTEST"; 
    } 
} 

Bin ich kompiliert?

Jetzt habe ich versucht, dies selbst zu verstehen. So kompilieren ich die Klasse Test.java von

javac Test.java 

Nach dem Aufruf, ich habe gelesen, dass ich javap verwenden können, den kompilierten Code (= Byte-Code) zu lesen.

Also habe ich versucht, die Umstrukturierung aus dem Compiler in dem Byte-Code zu sehen, die ich oben erwähnt habe (dass die Deklaration IN im Konstruktor ist). Aber wie?? Ist javap das richtige Werkzeug dafür? Wenn ja, mit welchen Parametern?

Danke für Ihre Hilfe!

bearbeiten:

Ok, danke so weit! Können Sie mir bitte erklären, wie man die Ausgabe von javap -c Test liest?

C:\Users\MyName\Desktop>javap -c Test 
Compiled from "Test.java" 
public class Test { 
    public Test(); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: aload_0 
     5: ldc   #2     // String TESTTEST 
     7: putfield  #3     // Field s:Ljava/lang/String; 
     10: return 
} 
+0

Das einzige, was ich in Ihrer Ausgabe sehe, ist der Konstruktor. 'public Test()' heißt so, wie es in Ihrer Quelldatei heißt. Du musst also nicht weit schauen, es ist direkt vor dir. Oder verstehe ich nicht, wonach du suchst? –

+0

Welche Veränderung erwarten Sie? Die zwei Formen sind gleichwertig. –

+0

Vielleicht könnten Sie in Ihre Frage eine Erklärung eingeben, was * Sie * denken, dass Ihre 'javap' Ausgabe bedeutet, und warum? Es sieht für mich wie Ihr zweiter Codeblock aus, und wenn ich Sie verstehe, haben Sie das erwartet. Ich bin also nicht sicher, warum du das Gefühl hast, dass du es nicht gefunden hast. –

Antwort

3

Da Ihr Feld private ist, müssen Sie auch das -p Argument geben private Mitglieder zu sehen. Um zu sehen, was mit mehreren Konstruktoren passiert, habe ich einen zusätzlichen hinzugefügt.

class Test { 
    private String s = "TESTTEST"; 
    Test() { 
    } 
    Test(int x) { 
    } 
} 
javap -c -p Test.class 
class Test { 
    private java.lang.String s; 

    Test(); 
    Code: 
     0: aload_0 
     1: invokespecial #10     // Method java/lang/Object."<init>":()V 
     4: aload_0 
     5: ldc   #12     // String TESTTEST 
     7: putfield  #14     // Field s:Ljava/lang/String; 
     10: return 

    Test(int); 
    Code: 
     0: aload_0 
     1: invokespecial #10     // Method java/lang/Object."<init>":()V 
     4: aload_0 
     5: ldc   #12     // String TESTTEST 
     7: putfield  #14     // Field s:Ljava/lang/String; 
     10: return 
} 

In beiden Konstrukteure, ist dies im Grunde:

<constructor> { 
    super();    // Instructions: 0, 1 
    this.s = "TESTTEST"; // Instructions: 4, 5, 7 
    return;    // Instructions: 10 
} 

Sie Bytecode Lehre über den Rahmen der Stackoverflow ist. Eine vollständige Liste der Bytecode-Anweisungen finden Sie unter The Java Virtual Machine Instruction Set.

+0

alles klar, danke! – mrbela