Heim >Java >javaLernprogramm >So verwenden Sie Javap zum Parsen von Java-Ganzzahlkonstanten und Ganzzahlvariablen
Der Inhalt dieses Artikels befasst sich mit der Verwendung von Javap zum Parsen von Java-Integer-Konstanten und Integer-Variablen. Ich hoffe, dass er für Sie hilfreich ist.
Die fünfte und neunte Zeile meines Codes unten definieren jeweils eine Ganzzahlvariable und eine Ganzzahlkonstante:
static final int number1 = 512; static int number3 = 545;
Java-Programmierer kennen alle den Unterschied zwischen den beiden.
Als nächstes werden wir Javap verwenden, um die .class-Datei zu dekompilieren und uns dann mit dem Unterschied zwischen Ganzzahlvariablen und Ganzzahlkonstanten in Java befassen.
Verwenden Sie die Befehlszeile javap -c konstant.ConstantFolding, um den aus der .class-Datei dekompilierten Bytecode anzuzeigen:
Ergebnis:
Die Beschreibung dieser Bytecode-Anweisungen wird in Wikipedia erklärt:
Wiki: https://en.wikipedia .org/ Wiki...
Wir Java-Programmierer müssen sie uns nicht alle merken, wir müssen nur diese Webseite mit einem Lesezeichen versehen und sie bei Bedarf als Wörterbuch verwenden:
sipush 545: Platziere die Ganzzahl 545 auf dem Stapel
putstatic #16:
Weisen Sie den Wert 545 auf dem Stapel der aktuellen Klasse in der Statik zu Feld.
Was bedeutet also #16 in putstatic #16?
Wenn wir zum Dekompilieren den Parameter javap -v verwenden, können wir den Konstantenpool dieser Klasse sehen (Konstantenpool). Schauen Sie sich die blau hervorgehobene Linie im Bild unten an:
constant/ConstantFolding .number3:I
Beschreibung #16 repräsentiert Mitglied Nummer3 der Klassenkonstante.ConstantFolding, Typ ist I.
An diesem Punkt werden diese beiden Zeilen von Bytecode-Anweisungen kombiniert und entsprechen tatsächlich dem Java-Code, den wir geschrieben haben:
static int number3 = 545;
Wir analysieren weiterhin den von Javap dekompilierten Bytecode.
aload_0: Laden Sie die Einführung der lokalen Variablen mit der Seriennummer 0 auf den Stapel.
invokespecial: Rufen Sie Mitglieder für das Objekt auf Instanzmethode: Wenn ein Rückgabewert vorhanden ist, wird der Rückgabewert der Methode auf dem Stapel gespeichert. Die aufgerufene spezifische Methode wird durch # identifiziert und der entsprechende Methodenname kann im Konstantenpool abgefragt werden.
ldc: Laden Sie den Wert der Konstante mit dem Codenamen #
Aus der Liste der Konstantenpools in der Abbildung unten können wir ersehen, dass die Konstante 318976 mit der Seriennummer #29 genau das Produkt der ganzzahligen Konstante Zahl1 (512) und der ganzzahligen Konstante (623) ist. Daraus ist ersichtlich, dass der Ausdruck Zahl1 * Zahl2, da die beiden an der Operation beteiligten Operanden durch STATIC- und FINAL-Änderungen zu ganzzahligen Konstanten geworden sind, das Produkt zur Kompilierungszeit erhalten kann, sodass der Compiler es zur Kompilierungszeit berechnet und speichern Sie es im Variablenpool mit der Sequenznummer #29.
Was ist also der entsprechende Bytecode für die Multiplikation ganzzahliger Variablen?
Beginnen Sie mit Code Nummer 3 in der Abbildung unten:
getstatic #16: Laden Sie das statische Mitglied #16 der Klasse auf den Stapel. Das entsprechende Mitglied von #16 ist Nummer3 und der Wert ist 545.
getstatic #18: Laden Sie das statische Mitglied #18 der Klasse auf den Stapel. Das entsprechende Mitglied von #18 ist Nummer4 und der Wert ist 619.
imul: Multiplikation zweier Ganzzahlen auf dem Stapel durchführen.
istore_2: Speichern Sie das Ergebnis in der lokalen Variablen 2.
Zu diesem Zeitpunkt wurde int product2 = number3 * number4 in unserem Java-Code ausgeführt.
Der verbleibende blaue Bytecode, den Sie sehen, entspricht der folgenden Zeile der Druckanweisung.
System.out.println("Value: " + product1 + " , " + product2);
Aus diesen Bytecodes geht auch hervor, dass wir in Java direkt das Pluszeichen verwenden, um String-Splicing-Vorgänge durchzuführen. Der Java-Compiler verwendet beim Kompilieren automatisch StringBuilder zur Optimierung.
Da das Produkt ganzzahliger Variablen ausgedruckt werden muss, lädt iload_2 des Bytecodes das zuvor in der lokalen Variable 2 mit istore_2 gespeicherte Berechnungsergebnis auf den Stack, sodass das Produktergebnis schließlich ausgegeben werden kann.
Ich hoffe, dass durch dieses einfache Beispiel jeder lernen kann, Javap zu verwenden, um einige Details von Java und JVM tiefgreifend zu verstehen.
Das obige ist der detaillierte Inhalt vonSo verwenden Sie Javap zum Parsen von Java-Ganzzahlkonstanten und Ganzzahlvariablen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!