我在嵌套类中的方法参数注释上遇到了一个奇怪的效果。在我看来,这非常像一个编译器问题。有关详细信息和重现步骤,请参见下文。
使用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中的注释数-为3。同时,由于一个额外的test.TestAnnotations,我们现在观察到4个方法参数(用于将对TestAnnotations.this的引用传递给内部类)。 。这意味着,@ MyAnnotation现在引用对象param2,向左移动1。
根据虚拟机规范,注释的数量应与方法参数的数量相同:
在这里,我们清楚地看到了违规行为。有人知道原因吗?真的是真的吗,只是一个编译器错误?
最佳答案
这是一个javac编译器错误,请参见:我刚刚提交的https://bugs.openjdk.java.net/browse/JDK-8065132。