【问题标题】:What's the conception behind: Type - Element - Mirror背后的概念是什么:类型 - 元素 - 镜子
【发布时间】:2010-01-23 12:27:41
【问题描述】:

我正在使用 Java 6 的注释处理,即可以在 javax.annotation.processing(不是 Java 5 的 APT)中找到的内容。

我想知道各种 ElementTypeMirror 类之间的概念区别是什么。由于我不太了解这一点,因此很难有效地对注释处理器进行编程。有多种方法可以在这些概念之间“转换”,但我不确定在使用它们时我在做什么。

例如,让我有一个AnnotationMirror 的实例。
当我调用 getAnnotationType() 时,我得到了一个 DeclaredType 的实例(无论出于何种原因,它都实现了 TypeMirror)。
然后我可以在这个上调用asElement() 并获取Element 的实例。
发生了什么事?

【问题讨论】:

    标签: java annotations


    【解决方案1】:

    这些概念之间确实存在重叠。

    • Element 模拟程序的静态结构,即包、类、方法和变量。想想你在 Eclipse 的包资源管理器中看到的一切。

    • Type 模拟程序的静态定义类型约束,即类型、泛型类型参数、泛型类型通配符。想想 Java 类型声明中的所有内容。

    • Mirror 是 Gilad Bracha 和 Dave Ungar 最初为 Self(一种基于原型的 Smalltalk 方言)开发的反射的替代概念。基本思想是将关于代码结构的查询(以及结构的运行时操作,可惜在 Java 中不可用)与域对象分开。因此,要查询一个对象的方法,而不是调用#getClass,您可以向系统询问一个镜子,通过它您可以看到对象的反射。由于这种分离,您还可以镜像未加载的类(如注释处理期间的情况),甚至是远程图像中的类。例如,V8(Google 的 Javascript 引擎)使用镜像来调试在另一个对象空间中运行的 Javascript 代码。

    【讨论】:

    • 理解这一点“你也可以在未加载的类上进行镜像(就像在注释处理期间的情况一样”确实帮助我使用注释处理器。
    【解决方案2】:

    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 类。该元素或多或少与不涉及泛型相同。

    【讨论】:

    • javadoc 并不清楚 TypeElement 是什么。我认为它更依赖于类型的声明(因此是类型参数),而 TypeDeclaration(令人困惑的名称)更依赖于类型的使用,例如在变量声明中。我知道这两个术语在注释的上下文中很难理解。
    • 但是按照这个questionDeclareType必须是MyException.class
    【解决方案3】:

    本文可能有助于理解Java 6注解处理的设计:

    Gilad Bracha 和 David Ungar。 Mirrors: Design Principles for Meta-level Facilities of Object-Oriented Programming Languages. 在过程中。的 ACM 会议关于面向对象 编程、系统、语言和 应用程序,2004 年 10 月。

    【讨论】:

    • 那么,我们是否有基于镜像的反射 API,而不是传统反射系统中的 getClass 之类的反射 API? java.lang.model.element.AnnotationMirror 类似于 ClassMirror(如本文所述)?
    猜你喜欢
    • 2012-04-17
    • 1970-01-01
    • 2011-01-15
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    相关资源
    最近更新 更多