2014-02-27 78 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

相關問題