2014-02-27 146 views
9

我遇到了一个奇怪的效果,与嵌套类中方法参数的注释有关。看起来非常像编译器问题。请参阅下面的详细信息和步骤来重现。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)中提取的可能为 的信息。)

这里我们清楚地看到违规。有谁知道原因?它看起来真的是一个编译器错误吗?

回答

6

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

+1

很高兴知道。这个问题是在反编译器Fernflower中找到的,它现在是IntelliJ IDEA的一部分。我们必须实现一个解决方法,将注释映射到参数,从列表的后面开始。 – Stiver