Java注释-javac编译器错误?

Java注释-javac编译器错误?,java,annotations,javac,nested-class,Java,Annotations,Javac,Nested Class,我在嵌套类中的方法参数注释方面遇到了一种奇怪的效果。在我看来,这很像是一个编译器问题。有关详细信息和复制步骤,请参见下文 用javac编译下面的类(我使用javac1.7.0_51)。注意带注释的参数“boolean param3” 然后用javap检查嵌套类(即javap-p-v-ctestAnnotations$TestInner.class)。其构造函数如下所示 public test.TestAnnotations$TestInner(test.TestAnnotations, jav

我在嵌套类中的方法参数注释方面遇到了一种奇怪的效果。在我看来,这很像是一个编译器问题。有关详细信息和复制步骤,请参见下文

用javac编译下面的类(我使用javac1.7.0_51)。注意带注释的参数“boolean param3”

然后用javap检查嵌套类(即javap-p-v-ctestAnnotations$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()
public test.TestAnnotations$TestInner(test.TestAnnotations,java.lang.String,
java.lang.Object,布尔);
旗帜:ACC_PUBLIC
代码:
堆栈=2,局部变量=5,参数大小=5
0:aload_0
1:aload_1
2:putfield#1//此$0:Ltest/TestAnnotations字段;
5:aload_0
6:invokespecial#2//方法java/lang/Object。”“:()V
9:返回
LineNumberTable:
第16行:0
RuntimeInvisibleParameterAnnotations:
0:
1:
2:
0: #18()
请注意属性RuntimeInvisibleParameterAnnotations中的注释数量-为3。同时,我们现在观察4个方法参数,因为在开始时有一个额外的test.TestAnnotations(它用于将对TestAnnotations.this的引用传递到内部类)。这意味着,@MyAnnotation现在引用的是对象param2,向左移动了1

根据虚拟机规范,注释的数量应与方法参数的数量相同:

num_参数

num_parameters项的值给出了 由方法_info结构表示的方法,在该结构上 出现注释。(这重复了可能被忽略的信息。) 从方法描述符中提取(§4.3.3)。)


在这里,我们清楚地看到了一种违反。有人知道原因吗?这真的是一个编译器错误吗?

这是一个javac编译器错误,请参阅:我刚刚提交的。

很高兴知道。这个问题是通过反编译器Fernflower发现的,它现在是IntelliJ IDEA的一部分。我们必须实现一种将注释映射到参数的变通方法,从列表后面开始。
 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()