AVAP est un outil fourni avec JDK. Vous pouvez le trouver sous / bin dans le répertoire d'installation JDK. Vous pouvez décompiler le code ou afficher le bytecode généré par le compilateur Java, analyser le processus d'exécution du code et comprendre le travail à l'intérieur de JVM.
Le suivant répertorie les options couramment utilisées et les descriptions de fonctions de la commande javap. Veuillez Google plus de fonctions pour plus de fonctions. L'auteur ne va pas le développer.
Résumé de l'utilisation
-aide
-L Tableau des lignes et variables de sortie
-Publique uniquement les méthodes et les domaines publics
-Protécés uniquement les cours et les membres publics et protégés
-Package uniquement les packages, les classes et les membres publics et protégés, qui est la valeur par défaut
-P -Private produit toutes les classes et les membres
- Sortie de type interne Signature
-C sort le code décomposé, par exemple, dans chaque méthode de la classe, une instruction contenant des bytecode java,
- Taille de pile de sortie verbale, nombre de paramètres de méthode
-Constants Sortie Constantes finales statiques
Étude de cas
La commande javap décompose un fichier de classe et détermine la sortie en fonction des options. Si les options ne sont pas utilisées, Javap sortira le package dans le fichier de classe, les domaines protégés et publics de la classe, et toutes les méthodes de la classe. Javap les sortira sur une sortie standard. Regardons cet exemple et compilons d'abord (Javac) la classe suivante.
package com.thundersoft.metadata.test.kafka; import org.apache.kafka.clients.consumer.consumerCord; import org.apache.kafka.clients.producer.kafkaproducer; import org.apache.kafka.crodiner.producer.producer; import org.apache.kafka.clients.producer.producercord; import org.junit.test; import java.util.arrays; import java.util.properties; public class kafkatest {@test public Void testProducer () {Properties props = new Properties (); Prophes.put ("bootstrap.servers", "192.168.204.30:9092"); propuls.put ("acks", "all"); Prophes.put ("Retries", 0); Prophes.put ("Batch.Size", 16384); Prophes.put ("Linger.ms", 1); Prophes.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"); Producteur <string, string> producer = new kafkaproducer <> (accessoires); pour (int i = 0; i <100; i ++) {producer.send (new productorRecord <string, string> ("my-topic", Integer.ToString (i), Integer.ToString (i))); } producer.close (); } @Test public void testKafkaconsumer () {Properties props = new Properties (); Prophes.put ("bootstrap.servers", "192.168.204.30:9092"); propuls.put ("groupe.id", "test"); props.put ("activer.auto.commit", "true"); 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 <> (accessoires); Consumer.Subscribe (arrays.aslist ("my-topic")); while (true) {ConsumerCords <String, String> enregistres = Consumer.Poll (100); pour (ConsumerCord <String, String> Record: Records) 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); }}Après avoir tapé Javap KafKatest sur la ligne de commande, le résultat de sortie est le suivant
classe publique 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 []);}Combiné avec le processus d'exécution du compilateur d'analyse de code
Ici, nous nous concentrons uniquement sur la logique de code dans la méthode principale. Le code de la méthode principale est le suivant
public static void main (String [] args) {int a = 2; int b = 3; int sum = a * b; System.out.println (SUM); }Après avoir tapé Javap -C KafKatest sur la ligne de commande, le résultat de sortie est le suivant
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 // champ java / lang / system.out: ljava / io / printStream; 11: Iload_3 12: invokevirtual # 54 // méthode java / io / printstream.println: (i) v 15: retour
Comme dans le code ci-dessus, iconst_2 et iconst_3 représentent respectivement les constantes 2 et 3. ILOAD_1 et ILOAD_2 représentent respectivement la définition de deux variables ordinaires, ILOAD_1 et ILOAD_2 représentent respectivement le chargement de deux variables dans la pile de données, IMUL représente l'opération de multiplication des deux variables, et le résultat est attribué à la variable ISTORE_3, et enfin le résultat est le rendement du programme.
Au cours du processus d'analyse de ce code simple, l'affiche a découvert un site Web pour les commandes de compilation JVM et a partagé les commandes JVM.
Résumer
L'auteur a fait un processus d'analyse de code simple à ce sujet, en espérant qu'il puisse aider ceux qui sont destinés à l'être. Javap peut être utilisé pour décompiler et afficher des bytecodes compilés par le compilateur. Généralement, peu de choses sont utilisées, mais Javap -C est souvent utilisée. Cette commande est utilisée pour répertorier les instructions JVM exécutées par chaque méthode. C'est un bon choix de résoudre des bugs d'erreur logique délicats. De plus, grâce à la comparaison de ByteCode et du code source, nous pouvons analyser profondément les principes de compilation et le processus d'exécution du code de Java pour résoudre divers problèmes de niveau de principe Java.