AVAP es una herramienta que viene con JDK. Puede encontrarlo debajo /bin en el directorio de instalación JDK. Puede descompilar el código o ver el bytecode generado por el compilador Java, analizar el proceso de ejecución del código y comprender el trabajo dentro de JVM.
Los siguientes enumeran las descripciones de opciones y funciones de uso común del comando javap. Por favor, busque en Google más funciones para obtener más funciones. El autor no explicará ello.
Resumen de uso
-ayuda
-L tabla de filas de salida y variables
-Public solo genera métodos y dominios públicos
-Protected solo emite clases y miembros públicos y protegidos
-La el paquete solo genera paquetes, clases y miembros públicos y protegidos, que es el valor predeterminado
-P -Private emite todas las clases y miembros
-s Firma de tipo interno de salida de salida
-C emite el código descompuesto, por ejemplo, en cada método de la clase, una instrucción que contiene Java bytecode,
-Las de la pila de salida verbosa, número de parámetros de método
-Constants salen constantes finales estáticas
Estudio de caso
El comando Javap descompone un archivo de clase y determina qué generar en función de las opciones. Si no se utilizan opciones, Javap generará el paquete en el archivo de clase, los dominios protegidos y públicos en la clase, y todos los métodos de la clase. Javap los generará en la salida estándar. Veamos este ejemplo y primero compilar (Javac) la siguiente clase.
paquete com.thundersoft.metadata.test.kafka; importar org.apache.kafka.clients.consumer.consumerrecord; import org.apache.kafka.clients.producer.kafkaproducer; import org.apache.kafka.clients.producer.producer; import; importar; import org.apache.kafka.clients.producer.producerRecord; import org.junit.test; import java.util.arrays; import java.util.properties; public class kafkatest {@test public void testProducer () {Properties props = nuevas propiedades (); Props.put ("Bootstrap.Servers", "192.168.204.30:9092"); propssput ("acks", "todos"); propssput ("reintentos", 0); props.put ("batch.size", 16384); props.put ("linger.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"); Productor <String, String> Producer = new Kafkaproducer <> (props); for (int i = 0; i <100; i ++) {producer.send (new ProducerRecord <String, String> ("My-Topic", Integer.ToString (i), Integer.ToString (i))); } producer.close (); } @Test public void testKafkAconsumer () {Properties props = new Properties (); Props.put ("Bootstrap.Servers", "192.168.204.30:9092"); propssput ("group.id", "prueba"); propssput ("enable.auto.commit", "verdadero"); 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 <> (Props); consumidor.subscribe (arrays.aslist ("my-topic")); while (true) {ConsumerRecords <String, String> Records = Consumer.Poll (100); para (ConsumerRecord <String, String> Record: Records) System.out.printf ("offset = %s, key = %s, valor = %s %n", registro.topic (), registro.key (), registro.value ()); }} public static void main (string [] args) {int a = 2; int b = 3; int sum = a*b; System.out.println (suma); }}Después de escribir Javap Kafkatest en la línea de comando, el resultado de la salida es el siguiente
clase pública 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 []);}Combinado con el proceso de ejecución del compilador de análisis de código de código
Aquí solo nos centramos en la lógica del código dentro del método principal. El código del método principal es el siguiente
public static void main (string [] args) {int a = 2; int b = 3; int sum = a*b; System.out.println (suma); }Después de escribir Javap -C Kafkatest en la línea de comando, el resultado de salida es el siguiente
Public static void main (java.lang.string []); Código: 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 // campo java/lang/system.out: lJava/io/printstream; 11: ILOAD_3 12: InvokeVirtual #54 // Método Java/io/printstream.println: (i) v 15: regreso
Como en el código anterior, IconSt_2 e IconSt_3 representan las constantes 2 y 3 respectivamente. iload_1 e iload_2 representan respectivamente la definición de dos variables ordinarias, iload_1 e iload_2 representan respectivamente la carga de dos variables en la pila de datos, IMUL representa la operación de multiplicación de las dos variables, y el resultado se asigna a la variable istore_3, y finalmente el resultado se emite y el programa regresa.
Durante el proceso de análisis de este código simple, el póster descubrió un sitio web para los comandos de compilación JVM y compartió los comandos JVM.
Resumir
El autor ha realizado un simple proceso de análisis de código, con la esperanza de que pueda ayudar a aquellos que están destinados a estar. JAVAP se puede usar para descompilar y ver el código de bytes compilado por el compilador. En general, no se usa mucho, pero Javap -C a menudo se usa. Este comando se utiliza para enumerar las instrucciones JVM ejecutadas por cada método. Es una buena opción resolver errores de error lógicos difíciles. Además, a través de la comparación de Bytecode y el código fuente, podemos analizar profundamente los principios de compilación y el proceso de ejecución del código de Java para resolver varios problemas de nivel de principios de Java.