2015-05-29 92 views
1

的我們有這個類:表示內源保留註釋

public class MyClass { 
    @Retention(RetentionPolicy.SOURCE) 
    private @interface MyInterface { } 

    @MyInterface 
    public void hello() { } 
} 

正如你所看到的,它有一個內部的唯一來源的註釋。我的問題是:導出的二進制文件(jar)是否包含MyClass$MyInterface.class文件?如果我們看保留,我們可以說不,因爲這個註釋應該被編譯器丟棄。但是它仍然被添加到MyClass.class的內部類的列表中,並且MyClass$MyInterface.class文件也被創建。

如果我們call

myClass.getEnclosedElements() 

MyClass$MyInterface.class不存在當我們對這種類

public class MyProcessedClass extends MyClass {} 

運行註釋處理器註釋處理失敗。如果存在MyClass$MyInterface.class,則處理正常。

original problem

+0

在'myClass.getEnclosedElements()'中,什麼是'myClass'?表示「MyClass」或「MyProcessedClass」的'TypeElement'? – Radiodef

+0

這應該是MyClass。 – WonderCsabo

回答

2

我的問題是:要導出的二進制文件(JAR)包含MyClass$MyInterface.class文件或沒有?

它應該。

13.1. The Form of a Binary

  • 每個類必須包含其所有成員類型的符號引用,並出現在其方法,構造所有本地和匿名類,靜態初始化器,實例初始化器和字段初始化器。
  • 4.7.6. The InnerClasses Attribute

    如果一個類或接口具有成員是類或接口,其constant_pool表(以及因此它的InnerClasses屬性)必須是指每個這樣的構件,即使該成員沒有另外提到的班級。

    因此MyClass必須有對MyInterface的參考。雖然我沒有引用它,但是如果有一個特定類的引用,那麼這個類應該被編譯。

    +0

    謝謝!我也檢查了JLS和JVM規範,但我認爲我搜索了錯誤的條款。 – WonderCsabo