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

使用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

10-02 00:47
查看更多