我正在使用Java6的批注处理,即可以在javax.annotation.processing中找到的批注处理(而不是Java5的APT)。
我想知道各种Element、Type和Mirror类在概念上的区别是什么。因为我并不真正理解这一点,所以很难高效地编写批注处理器。有各种方法可以在这些概念之间“转换”,但我不太确定在使用它们时我在做什么。
例如,让我有一个AnnotationMirror的实例。
当我调用getAnnotationType()时,我得到了DeclaredType的一个实例(不管出于什么原因,它都实现了TypeMirror )。
然后,我可以在这个函数上调用asElement(),并获得Element的一个实例。
发生了什么?
发布于 2010-01-24 08:10:55
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类。该元素大致相同,因为没有涉及到泛型。
发布于 2010-01-24 22:12:44
这些概念之间确实存在重叠。
Element对程序的静态结构进行建模,即包、类、方法和变量。只要想想你在Eclipse.Type包资源管理器中看到的对程序静态定义的类型约束的模型,即类型,泛型类型参数,泛型类型通配符。想想所有属于Java类型的东西,declarations.Mirror是Gilad Bracha和Dave Ungar最初为Self开发的反射的替代概念,Self是一种基于原型的Smalltalk方言。基本思想是将关于代码结构(以及结构的运行时操作,可惜在Java中不可用)的查询从域对象中分离出来。因此,要查询对象的方法,而不是调用#getClass,您可以向系统请求一个镜像,通过它可以看到对象的反射。多亏了这种分离,您还可以镜像未加载的类(就像在批注处理期间一样),甚至可以镜像远程映像中的类。例如,V8 (谷歌的Javascript引擎)使用镜像来调试在另一个对象空间中运行的Javascript代码。发布于 2010-01-24 21:54:01
本文可能有助于理解Java 6批注处理的设计:
以上是
新闻的吉拉德·布拉查和大卫·昂加带来的报道。进程中的Mirrors: Design Principles for Meta-level Facilities of Object-Oriented Programming Languages.ACM会议的on Object-Oriented Programming,System,Languages and Applications,2004年10月。
https://stackoverflow.com/questions/2123118
复制相似问题