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