>  기사  >  Java  >  javap를 사용하여 Java 정수 상수 및 정수 변수를 구문 분석하는 방법

javap를 사용하여 Java 정수 상수 및 정수 변수를 구문 분석하는 방법

不言
不言앞으로
2018-10-22 15:39:162812검색

이 기사의 내용은 javap를 사용하여 Java 정수 상수 및 정수 변수를 구문 분석하는 방법에 관한 것입니다. 이는 특정 참조 값을 가지고 있으므로 도움이 될 수 있습니다.

아래 코드의 다섯 번째 줄과 아홉 번째 줄은 각각 정수 변수와 정수 상수를 정의합니다.

static final int number1 = 512;
static int number3 = 545;

Java 프로그래머는 모두 둘 사이의 차이점을 알고 있습니다.

javap를 사용하여 Java 정수 상수 및 정수 변수를 구문 분석하는 방법

다음으로 javap를 사용하여 .class 파일을 디컴파일한 다음 Java에서 정수 변수와 정수 상수의 차이점을 살펴보겠습니다.

.class 파일에서 디컴파일된 바이트코드를 보려면 javap -c 상수.ConstantFolding 명령줄을 사용하세요.

javap를 사용하여 Java 정수 상수 및 정수 변수를 구문 분석하는 방법

결과:

javap를 사용하여 Java 정수 상수 및 정수 변수를 구문 분석하는 방법

이 바이트코드 명령어에 대한 설명은 Wikipedia에 있습니다. 지침:

wiki: https://en.wikipedia.org/wiki...

Java 프로그래머는 모든 내용을 외울 필요가 없습니다. 이 웹 페이지를 저장하고 작업할 때 사전으로 사용하기만 하면 됩니다. 필요합니다. 다음을 사용하세요.

javap를 사용하여 Java 정수 상수 및 정수 변수를 구문 분석하는 방법

sipush 545: 스택에 정수 545를 배치합니다.

putstatic #16:

스택의 값 545를 현재 클래스의 정적 필드에 할당합니다.

javap를 사용하여 Java 정수 상수 및 정수 변수를 구문 분석하는 방법

그럼 putstatic #16의 #16은 무엇을 의미하나요?

그런 다음 javap -v 매개변수를 사용하여 디컴파일하면 이 클래스의 상수 풀을 볼 수 있습니다. 아래 그림에서 파란색으로 강조 표시된 줄을 확인하세요.

constant/ConstantFolding.number3:I

Explanation# 16은 다음을 나타냅니다. Constant.ConstantFolding 클래스의 멤버 번호 3, 유형은 I입니다.

javap를 사용하여 Java 정수 상수 및 정수 변수를 구문 분석하는 방법

이 시점에서 이 두 줄의 바이트코드 명령어가 결합되어 실제로 우리가 작성한 Java 코드에 해당합니다.

static int number3 = 545;

우리는 javap로 디컴파일된 바이트코드를 계속 분석합니다.

javap를 사용하여 Java 정수 상수 및 정수 변수를 구문 분석하는 방법

aload_0: 일련 번호가 0인 지역 변수의 도입부를 스택에 로드합니다.

invokespecial: 개체 인스턴스에서 멤버 메서드를 호출합니다. 반환 값이 있는 경우 메서드의 반환 값은 다음과 같습니다. 스택에 저장됩니다. 호출되는 특정 메소드는 #으로 식별되며 해당 메소드 이름은 상수 풀에서 조회할 수 있습니다.

ldc: 상수 풀에서 #라는 코드명 상수 값을 스택으로 로드합니다.

아래 그림의 상수 풀 목록에서 일련 번호 #29의 상수 318976이 정확히 정수 상수 번호 1(512)과 정수 상수(623)의 곱임을 알 수 있습니다. 이를 통해 수식 number1 * number2를 알 수 있는데, 연산에 관여하는 두 개의 피연산자가 STATIC과 FINAL 수정을 통해 정수 상수가 되었기 때문에 컴파일 타임에 곱을 얻을 수 있으므로 컴파일러는 이를 컴파일 타임에 계산해서 나온다. 시퀀스 번호 #29로 변수 풀에 저장합니다.

javap를 사용하여 Java 정수 상수 및 정수 변수를 구문 분석하는 방법

그렇다면 정수 변수를 곱할 때 해당 바이트코드는 어떻게 생겼을까요?

아래 그림의 코드 번호 3부터 시작합니다.

getstatic #16: 클래스의 정적 멤버 #16을 스택에 로드합니다. #16의 해당 멤버는 3번이고 값은 545입니다.

getstatic #18: 클래스의 정적 멤버 #18을 스택에 로드합니다. #18의 해당 멤버는 number4이고 값은 619입니다.

imul: 스택에서 두 정수의 곱셈을 수행합니다.

istore_2: 결과를 로컬 변수 2에 저장합니다.

이 시점에서 Java 코드의 int product2 = number3 * number4가 실행되었습니다.

표시되는 나머지 파란색 바이트코드는 다음 print 문의 줄에 해당합니다.

System.out.println("Value: " + product1 + " , " + product2);

Java에서는 문자열 접합 작업을 수행하기 위해 더하기 기호를 직접 사용한다는 것을 이러한 바이트코드에서 볼 수 있습니다. Java 컴파일러는 컴파일할 때 최적화를 위해 자동으로 StringBuilder를 사용합니다.

정수 변수의 곱을 출력해야 하므로 바이트코드의 iload_2는 istore_2와 함께 이전에 로컬 변수 2에 저장된 계산 결과를 스택에 로드하여 최종적으로 곱 결과를 출력할 수 있습니다.

javap를 사용하여 Java 정수 상수 및 정수 변수를 구문 분석하는 방법

이 간단한 예제를 통해 모든 사람이 javap를 사용하여 Java 및 JVM의 세부 사항을 깊이 이해할 수 있기를 바랍니다.

위 내용은 javap를 사용하여 Java 정수 상수 및 정수 변수를 구문 분석하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제