Heim  >  Artikel  >  Java  >  So verwenden Sie Javap zum Parsen von Java-Ganzzahlkonstanten und Ganzzahlvariablen

So verwenden Sie Javap zum Parsen von Java-Ganzzahlkonstanten und Ganzzahlvariablen

不言
不言nach vorne
2018-10-22 15:39:162774Durchsuche

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.

So verwenden Sie Javap zum Parsen von Java-Ganzzahlkonstanten und Ganzzahlvariablen

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:

So verwenden Sie Javap zum Parsen von Java-Ganzzahlkonstanten und Ganzzahlvariablen

Ergebnis:

So verwenden Sie Javap zum Parsen von Java-Ganzzahlkonstanten und Ganzzahlvariablen

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:

So verwenden Sie Javap zum Parsen von Java-Ganzzahlkonstanten und Ganzzahlvariablen

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.

So verwenden Sie Javap zum Parsen von Java-Ganzzahlkonstanten und Ganzzahlvariablen

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.

So verwenden Sie Javap zum Parsen von Java-Ganzzahlkonstanten und Ganzzahlvariablen

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.

So verwenden Sie Javap zum Parsen von Java-Ganzzahlkonstanten und Ganzzahlvariablen

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 dem Konstantenpool auf den Stapel.

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.

So verwenden Sie Javap zum Parsen von Java-Ganzzahlkonstanten und Ganzzahlvariablen

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.

So verwenden Sie Javap zum Parsen von Java-Ganzzahlkonstanten und Ganzzahlvariablen

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen