AVAP는 JDK와 함께 제공되는 도구입니다. JDK 설치 디렉토리에서 /bin 아래를 찾을 수 있습니다. 코드를 디 컴파일하거나 Java 컴파일러에서 생성 된 바이트 코드를보고 코드 실행 프로세스를 분석하며 JVM 내의 작업을 이해할 수 있습니다.
다음은 Javap 명령의 일반적으로 사용되는 옵션 및 기능 설명을 나열합니다. 더 많은 기능은 Google 더 많은 기능을 알려주십시오. 저자는 그것에 대해 자세히 설명하지 않을 것입니다.
사용량 요약
-돕다
-L 출력 행 및 변수 테이블
-공개 만 공개 방법과 도메인을 출력합니다
-공개 및 보호 된 클래스 및 멤버 만 출력합니다
-패키지는 패키지, 공개 및 보호 클래스 및 멤버 만 출력합니다.
-P- 프라이버시는 모든 클래스와 멤버를 출력합니다
-S 내부 유형 시그니처 출력
-C는 클래스의 각 메소드에서 java bytecode를 포함하는 명령어에서 분해 된 코드를 출력합니다.
-비방 출력 스택 크기, 메소드 매개 변수 수
-스턴트 출력 정적 최종 상수
사례 연구
Javap 명령은 클래스 파일을 분해하며 옵션을 기반으로 출력 할 내용을 결정합니다. 옵션을 사용하지 않으면 Javap은 클래스 파일, 클래스의 보호 및 공개 도메인 및 클래스의 모든 메소드에서 패키지를 출력합니다. Javap은 표준 출력에서 출력합니다. 이 예제를 살펴보고 다음 수업을 Compile (Javac).
패키지 com.thundersoft.metadata.test.kafka; import org.apache.kafka.clients.consumer.consumerRecord; import org.apache.kafka.clients.kafkaproducer; import org.apache.kafka.clients.producer.producer; import org.apcachache org.junit.test; import java.util.arrays; import java.util.properties; public class kafkatest {@test public void testproducer () {properties propers = new Properties (); props.put ( "bootstrap.servers", "192.168.204.30:9092"); props.put ( "acks", "all"); props.put ( "재시험", 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"); Producer <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 teskafkaconsumer () {properties props = new Properties (); props.put ( "bootstrap.servers", "192.168.204.30:9092"); props.put ( "group.id", "test"); props.put ( "enable.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 <> (props); 소비자 .subscribe (arrays.aslist ( "my-topic")); while (true) {ConsecerRecords <String, String> Records = Consumer.poll (100); for (consideRecord <string, string> record : records) system.out.printf ( "오프셋 = %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); }}명령 줄에서 Javap Kafkatest를 입력 한 후 출력 결과는 다음과 같습니다.
public class com.thundersoft.metadata.test.kafka.kafkatest {public com.thundersoft.metadata.test.kafka.kafkatest (); 공개 void testProducer (); 공개 void teskafkaconsumer (); public static void main (java.lang.string []);}코드 분석 컴파일러 실행 프로세스와 결합합니다
여기서 우리는 기본 메소드 내부의 코드 로직에만 초점을 맞 춥니 다. 주요 방법 코드는 다음과 같습니다
public static void main (String [] args) {int a = 2; int b = 3; int sum = a*b; System.out.println (sum); }명령 줄에서 Javap -C Kafkatest를 입력 한 후 출력 결과는 다음과 같습니다.
public static void main (java.lang.string []); 코드 : 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 // field java/lang/system.out : ljava/io/printstream; 11 : iload_3 12 : invokevirtual #54 // 메소드 java/io/printstream.println : (i) v 15 : 반환
위의 코드에서와 같이, ICONST_2 및 ICONST_3은 각각 상수 2 및 3을 나타냅니다. ILOAD_1 및 ILOAD_2는 각각 두 가지 일반 변수의 정의 인 ILOAD_1 및 ILOAD_2의 정의를 각각 데이터 스택에로드하는 것을 나타냅니다. IMUL은 두 변수의 곱셈 작업을 나타내며 결과는 변수 ISTORE_3에 할당됩니다.
이 간단한 코드를 분석하는 과정에서 포스터는 JVM 컴파일 명령을위한 웹 사이트를 발견하고 JVM 명령을 공유했습니다.
요약
저자는 간단한 코드 분석 프로세스를 수행하여 운명의 사람들을 도울 수 있기를 바라고 있습니다. Javap은 컴파일러가 컴파일하고 컴파일 된 바이트 코드를 보는 데 사용될 수 있습니다. 일반적으로 많이 사용되지는 않지만 Javap -C는 종종 사용됩니다. 이 명령은 각 메소드에서 실행 된 JVM 명령을 나열하는 데 사용됩니다. 까다로운 로직 오류 버그를 해결하는 것이 좋습니다. 또한 바이트 코드와 소스 코드의 비교를 통해 다양한 Java 원칙 수준 문제를 해결하기 위해 Java의 컴파일 원칙 및 코드 실행 프로세스를 깊이 분석 할 수 있습니다.