AVAP é uma ferramenta que vem com o JDK. Você pode encontrá -lo em /bin no diretório de instalação do JDK. Você pode descompilar o código ou visualizar o bytecode gerado pelo compilador Java, analisar o processo de execução do código e entender o trabalho dentro da JVM.
O seguinte lista as opções e descrições de funções comumente usadas do comando javap. Por favor, pesquise no Google mais funções para obter mais funções. O autor não vai elaborar.
Resumo do uso
-ajuda
-l Tabela de linhas de saída e variáveis
-Public apenas produz métodos e domínios públicos
-Protected Somente emite classes e membros públicos e protegidos
-Package apenas produz pacotes, classes e membros públicos e protegidos, que é o padrão
-P -Private produz todas as classes e membros
-S saída de tipo interno de assinatura
-C produz o código decomposto, por exemplo, em cada método da classe, uma instrução que contém Java Bytecode,
-Tamanho da pilha de saída do verbose, número de parâmetros de método
-CONTRANTS SAUTAR CONSTANTES FINAIS ESTÁTICAS
Estudo de caso
O comando javap decompõe um arquivo de classe e determina o que produzir com base nas opções. Se as opções não forem usadas, o Javap produzirá o pacote no arquivo de classe, domínios protegidos e públicos na classe e todos os métodos da classe. O Javap os produzirá na saída padrão. Vejamos este exemplo e primeiro compilar (JAVAC) a aula a seguir.
pacote com.thundersoft.metadata.test.kafka; importar org.apache.kafka.clients.consumer.consumerrecord; importar org.apache.kafka.clients.producer.kafkaproducer; import orgache.kafka.clients.producer.producer; org.apache.kafka.clients.producer.produCerrecord; importar org.junit.test; importar java.util.arrays; importar java.util.properties; public class Kafkatest (@Test public void testProdUcer () {Propriedades props.put ("bootstrap.servers", "192.168.204.30:9092"); props.put ("acks", "all"); props.put ("tentativas", 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"); Produtor <String, String> Produtor = new Kafkaproduced <> (Props); for (int i = 0; i <100; i ++) {produtor.send (new ProduDerRecord <string, string> ("my-topic", integer.toString (i), Integer.toString (i))); } produtor.close (); } @Test public void testkafkaconsumer () {Propriedades props = new Properties (); props.put ("bootstrap.servers", "192.168.204.30:9092"); props.put ("group.id", "teste"); props.put ("enable.auto.comit", "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 <> (adereços); consumer.subscribe (Arrays.asList ("my-tópico")); while (true) {ConsumerRecords <string, string> registros = consumer.poll (100); para (ConsumerRecord <string, string> registros: registros) System.out.printf ("offset = %s, key = %s, value = %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 (soma); }}Depois de digitar Javap Kafkatest na linha de comando, o resultado da saída é o seguinte
classe 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 com o processo de execução do compilador de análise de código
Aqui, focamos apenas a lógica do código dentro do método principal. O código principal do método é o seguinte
public static void main (string [] args) {int a = 2; int b = 3; int sum = a*b; System.out.println (soma); }Depois de digitar Javap -C Kafkatest na linha de comando, o resultado da saída é o seguinte
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/printStre; 11: ILOAD_3 12: InvokeVirtual #54 // Método java/io/printStream.println: (i) v 15: retornar
Como no código acima, o iconst_2 e o iconst_3 representam as constantes 2 e 3, respectivamente. ILOAD_1 e ILOAD_2 representam respectivamente a definição de duas variáveis comuns, ILOAD_1 e ILOAD_2 representam respectivamente o carregamento de duas variáveis na pilha de dados, o IMUL representa a operação de multiplicação das duas variáveis, e o resultado é atribuído à variável IStore_3, e finalmente o resultado é o resultado.
Durante o processo de análise desse código simples, o pôster descobriu um site para comandos de compilação da JVM e compartilhou os comandos da JVM.
Resumir
O autor fez um processo simples de análise de código, esperando que possa ajudar aqueles que estão destinados a estar. O Javap pode ser usado para descompilar e visualizar bytecode compilado pelo compilador. Geralmente, não é usado muito, mas o Javap -C é frequentemente usado. Este comando é usado para listar as instruções da JVM executadas por cada método. É uma boa opção para resolver erros de erro lógico complicados. Além disso, através da comparação do ByteCode e do código-fonte, podemos analisar profundamente os princípios de compilação e o processo de execução de código do Java para resolver vários problemas no nível de princípios Java.