2010-01-23 60 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