我遇到了一个奇怪的效果,与嵌套类中方法参数的注释有关。看起来非常像编译器问题。请参阅下面的详细信息和步骤来重现。Java注释 - 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数量 - 这是3.同时,我们现在开始观察,因为一个额外的test.TestAnnotations 4个方法参数(这是用来传递到TestAnnotations参考进入内部阶层)。这意味着@MyAnnotation现在引用Object param2,向左移动1。
根据该虚拟机规范注释的数量应该是一样的方法参数的数量:
num_parameters
的num_parameters项目的值给出的 的参数的数量由发生注释的method_info结构表示的方法。 (这复制了从方法描述符(§4.3.3)中提取的可能为 的信息。)
这里我们清楚地看到违规。有谁知道原因?它看起来真的是一个编译器错误吗?
很高兴知道。这个问题是在反编译器Fernflower中找到的,它现在是IntelliJ IDEA的一部分。我们必须实现一个解决方法,将注释映射到参数,从列表的后面开始。 – Stiver