2014-02-27 2 views
9

중첩 된 클래스의 메서드 매개 변수에 대한 주석과 관련하여 이상한 효과가 나타났습니다. 나에게 컴파일러 문제와 매우 흡사하다. 재현 할 세부 정보 및 단계는 아래를 참조하십시오.자바 주석 - 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)에서 추출한 일 수있는 정보를 복제합니다.

여기서 우리는 분명히 위반 사항을 봅니다. 그 이유를 아는 사람이 있습니까? 컴파일러 버그일까요?

답변

6

이것은 javac 컴파일러 버그입니다 (방금 전에 출원 한 https://bugs.openjdk.java.net/browse/JDK-8065132 참조).

+1

알아두면 좋은 정보. 이 문제는 이제 IntelliJ IDEA의 일부인 분해 컴파일러 Fernflower에서 발견되었습니다. 어노테이션을 매개 변수에 매핑하기위한 해결 방법을 구현해야했습니다. 이제 목록 뒤에서 시작하십시오. – Stiver

관련 문제