背后的概念是什么:类型 - 元素 - 镜像

2022-09-01 18:51:11

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

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

因此,例如,让我有一个 .
当我调用时,我得到一个实例(无论出于何种原因实现)。
然后,我可以调用这个并获取.
发生了什么事?AnnotationMirrorgetAnnotationType()DeclaredTypeTypeMirrorasElement()Element


答案 1

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

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

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

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


答案 2

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

Gilad Bracha和David Ungar。镜像:面向对象编程语言的元级工具的设计原则。ACM Conf. on Object-Oriented Programming, Systems, Languages and Applications, 2004 年 10 月。


推荐