2010-01-23 38 views
17

我正在使用Java 6的註釋處理,即可以在javax.annotation.processing(而不是Java 5的APT)中找到的東西。什麼是背後的概念:類型 - 元素 - 鏡像

我想知道各種Element,TypeMirror類之間的概念差異是什麼。由於我不太明白這一點,因此很難有效地對註釋處理器進行編程。有很多方法可以在這些概念之間進行「轉換」,但我不確定使用它們時我正在做什麼。

因此,例如,讓我有一個AnnotationMirror的實例。
當我撥打getAnnotationType()時,我得到一個DeclaredType(無論出於何種原因實施TypeMirror)的實例。
然後我可以打電話給asElement()並獲得Element的實例。
發生了什麼?

回答

5

javax.lang.model.element.AnnotationMirror類型的對象表示代碼中的註釋。

聲明的類型表示註釋類。

它的元素是泛型類(有關此事的更多信息,請參閱http://java.sun.com/javase/6/docs/api/javax/lang/model/element/TypeElement.html)。該元素可能是類的通用版本,如List,其中聲明的類型是參數化版本,例如List<String>。但是我不確定註釋類是否可以使用泛型,因此在這種情況下區分可能是無關緊要的。

比如可以說你有以下JUnit4方法:

@Test(expected = MyException.class) 
public void myTest() { 
    // do some tests on some class... 
} 

的AnnotationMirror代表@Test(expected = NullPointerException.class)。聲明的類型是org.junit.Test類。元素或多或少與沒有涉及的泛型相同。

+0

javadoc並不十分清楚TypeElement是什麼。我認爲它與類型的聲明(因此是類型參數)更緊密地聯繫在一起,而TypeDeclaration(令人困惑的名字)更多地與使用類型相關聯,例如在變量聲明中。我認爲這兩個術語在註釋中很難理解。 – Wolfgang 2010-01-27 12:52:49

+0

但是根據這個[question](http://stackoverflow.com/questions/31245638/understanding-typeelement-and-declaredtype-in​​terface-in-java),'DeclareType'必須是'MyException.class' – overexchange 2015-07-11 13:01:50

5

本文可以幫助理解Java 6的註解處理的設計:

吉拉德·布拉徹和戴維·安加。 Mirrors: Design Principles for Meta-level Facilities of Object-Oriented Programming Languages.在Proc。 ACM Conf。的 。在面向對象編程 ,系統,語言和 應用,2004年10月

+0

所以,在傳統的反射系統中反射api的類似'getClass',我們有基於鏡像的反射api的嗎? 'java.lang.model.element.AnnotationMirror'就像'ClassMirror'(如本文所述)? – overexchange 2015-07-09 23:55:32

19

確實存在這些概念之間的重疊。

  • Element模擬程序的靜態結構,即包,類,方法和變量。想想你在Eclipse的包瀏覽器中看到的所有內容。

  • Type模擬靜態定義的程序類型約束,即類型,泛型類型參數,泛型類型通配符。想想所有屬於Java類型聲明的部分。

  • Mirror是Gilad Bracha和Dave Ungar最初爲Self開發的基於原型的Smalltalk方言的反思的另一種概念。基本思想是從域對象中分離關於代碼結構的查詢(以及對結構的運行時操作,但在Java中不可用)。因此,要查詢關於其方法的對象,而不是調用#getClass,您可以向系統請求一個鏡像,通過它可以看到對象的反射。由於這種分離,您還可以對未加載的類(如註釋處理期間的情況)或遠程圖像中的類進行鏡像。例如V8(Google的Javascript引擎)使用鏡像來調試運行在另一個對象空間中的Javascript代碼。

+1

瞭解這一點「你也可以對未加載的類進行鏡像(就像在註釋處理過程中那樣」真的幫助我使用Annotation處理器。 – Guillaume 2017-02-02 12:52:50