Java注释 - javac编译器错误?

Sti*_*ver 10 java annotations javac nested-class

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

使用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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后用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()
Run Code Online (Sandbox Code Playgroud)

注意属性RuntimeInvisibleParameterAnnotations中的注释数量 - 它是3.同时我们现在观察4个方法参数,因为一个额外的test.TestAnnotations在开头(它用于传递对TestAnnotations.this的引用到内部类) .这意味着,@ MyAnnotation现在引用Object param2,向左移动1.

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

num_parameters

num_parameters项的值给出由发生注释的method_info结构表示的方法的参数数.(这会复制可从方法描述符(第4.3.3节)中提取的信息.)

在这里,我们清楚地看到违规.有谁知道原因?它真的是它看起来是什么,只是一个编译器错误?

Joe*_*nck 7

这是一个javac编译器错误,请参阅:我刚提交的https://bugs.openjdk.java.net/browse/JDK-8065132.

  • 很高兴知道。通过反编译器Fernflower发现了此问题,该反编译器现在是IntelliJ IDEA的一部分。我们必须实现一种解决方法,将注释映射到参数,现在从列表的背面开始。 (2认同)