AVAP ist ein Werkzeug, das mit JDK geliefert wird. Sie finden es unter /bin im JDK -Installationsverzeichnis. Sie können den Code dekompilieren oder den vom Java -Compiler generierten Bytecode anzeigen, den Codeausführungsprozess analysieren und die Arbeiten innerhalb von JVM verstehen.
Im Folgenden werden die häufig verwendeten Optionen und Funktionsbeschreibungen des Javap -Befehls aufgeführt. Bitte google mehr Funktionen für weitere Funktionen. Der Autor wird es nicht näher erläutern.
Nutzungszusammenfassung
-helfen
-l Tabelle mit Ausgangszeilen und Variablen
-Public gibt nur öffentliche Methoden und Domänen aus
-geschützt wird nur öffentliche und geschützte Klassen und Mitglieder ausgibt
-Package gibt nur Pakete, öffentliche und geschützte Klassen und Mitglieder aus, was der Standard ist
-P -Private gibt alle Klassen und Mitglieder aus
-S Ausgabe interner Typ Signatur
-C gibt den zerlegten Code beispielsweise in jeder Methode in der Klasse aus, eine Anweisung, die Java -Bytecode enthält.
-Verbose Ausgangsstapelgröße, Anzahl der Methodenparameter
-Konstanten geben statische endgültige Konstanten aus
Fallstudie
Der Befehl javap zerlegt eine Klassendatei und bestimmt, was auf Optionen ausgibt. Wenn keine Optionen verwendet werden, gibt Javap das Paket in der Klassendatei, geschützt und öffentlich in der Klasse und alle Methoden in der Klasse aus. Javap gibt sie für die Standardausgabe aus. Schauen wir uns dieses Beispiel an und kompilieren Sie zuerst (Javac) die folgende Klasse.
Paket com.thundersoft.metadata.test.kafka; import org.apache.kafka.clients.consumer.consumerrecord; import org.apache.kafka.clients.Producer.Kafkaproducer; Import org.apache.kafka.clients.Prodaucer.Producer.Producer.Producer; org.apache.kafka.clients.Producer.Producerrecord; import org.junit.test; import Java.util.arrays; Import Java.util.Properties; öffentliche Klasse kafkatest {@Test Public void testProcer () {Properties props = neue Eigenschaften (). props.put ("bootstrap.servers", "192.168.204.30:9092"); props.put ("acks", "alles"); props.put ("returns", 0); props.put ("batch.size", 16384); props.put ("dinger.ms", 1); props.put ("buffer.memory", 33554432); props.put ("key.serializer", "org.apache.kafka.common.serialization.Stringserializer"); props.put ("value.serializer", "org.apache.kafka.common.Serialization.Stringserializer"); props.put ("value.serializer", "org.apache.kafka.common.Serialization.Stringserializer"); Produzent <String, String> Produzent = neuer KafkaproDucer <> (Requisiten); für (int i = 0; i <100; i ++) {Produzent.send (neue prococeNRecord <String, String> ("my-topic", Integer.toString (i), Integer.toString (i))); } proconer.close (); } @Test public void testkafkaconsumer () {Properties props = new Properties (); props.put ("bootstrap.servers", "192.168.204.30:9092"); props.put ("Gruppe.id", "test"); props.put ("enable.auto.commit", "wahr"); props.put ("auto.commit.interval.ms", "1000"); props.put ("key.deserializer", "org.apache.kafka.common.serialization.stringDeserializer"); props.put ("value.deserializer", "org.apache.kafka.common.serialization.stringDeserializer"); Kafkaconsumer <String, String> Consumer = new Kafkaconsumer <> (Requisiten); Consumer.Subscribe (arrays.aslist ("my-topic")); while (true) {condenterRecords <String, String> records = conbraucher.poll (100); für (condentReRecord <String, String> Datensatz: Datensätze) system.out.printf ("offset = %s, key = %s, value = %s %n", record.topic (), record.key (), record.value ()); }} public static void main (String [] args) {int a = 2; int b = 3; int sum = a*b; System.out.println (sum); }}Nach dem Eingeben von Javap Kafkatest in die Befehlszeile lautet das Ausgabeergebnis wie folgt
öffentliche Klasse com.thundersoft.metadata.test.kafka.kafkatest {public com.thundersoft.metadata.test.kafka.kafkatest (); public void testProducer (); public void testkafkaconsumer (); Public Static Void Main (Java.lang.String []);};Kombiniert mit Codeanalyse -Compiler -Ausführungsprozess
Hier konzentrieren wir uns nur auf die Codelogik innerhalb der Hauptmethode. Der Hauptmethodencode ist wie folgt
public static void main (String [] args) {int a = 2; int b = 3; int sum = a*b; System.out.println (sum); }Nach dem Eingeben von Javap -c Kafkatest in der Befehlszeile lautet das Ausgabeergebnis wie folgt
Public Static Void Main (Java.lang.String []); Code: 0: iconst_2 1: istore_1 2: iconst_3 3: istore_2 4: iLoad_1 5: iload_2 6: Imul 7: istore_3 8: getStatic #47 // Feld java/lang/system.out: ljava/io/printstream; 11: iload_3 12: invokevirtual #54 // Methode Java/io/printstream.println: (i) v 15: Rückgabe
Wie im obigen Code repräsentieren iconst_2 und iconst_3 Konstanten 2 bzw. 3. uload_1 und iload_2 repräsentieren die Definition von zwei gewöhnlichen Variablen, ILOAD_1 und ILOAD_2, das Laden von zwei Variablen in den Datenstapel, IMUL repräsentiert den Multiplikationsvorgang der beiden Variablen, und das Ergebnis wird der Variablen ISTORE_3 und schließlich die Ergebnisse des Programms zugewiesen und das Ergebnis des Programms und das Ergebnis des Programms und die Programme.
Während der Analyse dieses einfachen Code entdeckte das Poster eine Website für JVM -Kompilierungsbefehle und teilte die JVM -Befehle aus.
Zusammenfassen
Der Autor hat einen einfachen Codeanalyseprozess darüber durchgeführt, in der Hoffnung, dass er denjenigen helfen kann, die dazu bestimmt sind. Javap kann verwendet werden, um das kompilierte Bytecode durch den Compiler zu dekompilieren und zu sehen. Im Allgemeinen wird nicht viel verwendet, aber oft wird Javap -c verwendet. Dieser Befehl wird verwendet, um die von jeder Methode ausgeführten JVM -Anweisungen aufzulisten. Es ist eine gute Wahl, knifflige Logikfehlerfehler zu lösen. Darüber hinaus können wir durch den Vergleich von Bytecode- und Quellcode die Kompilierungsprinzipien und den Codeausführungsprozess von Java tief analysieren, um verschiedene Probleme mit Prinzipien auf Java zu lösen.