중첩 된 클래스의 메서드 매개 변수에 대한 주석과 관련하여 이상한 효과가 나타났습니다. 나에게 컴파일러 문제와 매우 흡사하다. 재현 할 세부 정보 및 단계는 아래를 참조하십시오.자바 주석 - javac 컴파일러 버그?
다음 클래스를 javac (저는 javac 1.7.0_51 사용)로 컴파일하십시오. 주석 된 매개 변수 "boolean param3"에 유의하십시오.
import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
public class TestAnnotations {
public String a;
@Retention(RetentionPolicy.CLASS)
@interface MyAnnotation {}
protected class TestInner {
public TestInner(String param1, Object param2,
@MyAnnotation boolean param3) {}
public void accessField() {
System.out.println(TestAnnotations.this.a);
}
}
}
그 다음은 javap로 중첩 클래스 (즉은 javap -p -v -c TestAnnotations $ TestInner.class)를 검사합니다. 생성자는 다음과 같습니다.
public test.TestAnnotations$TestInner(test.TestAnnotations, java.lang.String,
java.lang.Object, boolean);
flags: ACC_PUBLIC
Code:
stack=2, locals=5, args_size=5
0: aload_0
1: aload_1
2: putfield #1 // Field this$0:Ltest/TestAnnotations;
5: aload_0
6: invokespecial #2 // Method java/lang/Object."<init>":()V
9: return
LineNumberTable:
line 16: 0
RuntimeInvisibleParameterAnnotations:
0:
1:
2:
0: #18()
주 속성 RuntimeInvisibleParameterAnnotations에 주석의 수 - 그것은 우리가 지금 시작 부분에 있기 때문에 하나의 추가 test.TestAnnotations의 4 개 메서드 매개 변수를 관찰 동시에 3의은 (는 TestAnnotations에 대한 참조를 전달하는 데 사용됩니다 이것은 내부 클래스로). 즉, @MyAnnotation은 Object param2를 참조하고 왼쪽으로 1 시프트했습니다. num_parameters 항목의 값이 의 파라미터의 수를 제공
num_parameters :
가상 머신 명세에 따라 주석의 수에있어서의 파라미터의 수와 동일해야 메서드는 주석이 발생하는 method_info 구조로 표현됩니다. (이는 메소드 설명자 (§4.3.3)에서 추출한 일 수있는 정보를 복제합니다.
여기서 우리는 분명히 위반 사항을 봅니다. 그 이유를 아는 사람이 있습니까? 컴파일러 버그일까요?
알아두면 좋은 정보. 이 문제는 이제 IntelliJ IDEA의 일부인 분해 컴파일러 Fernflower에서 발견되었습니다. 어노테이션을 매개 변수에 매핑하기위한 해결 방법을 구현해야했습니다. 이제 목록 뒤에서 시작하십시오. – Stiver