java - TypeElement 与 TypeMirror 作为 Java 注释处理器的数据模型

标签 java annotations annotation-processing

我正在开发一个带有注释处理的代码生成器,并将逻辑分为 2 个步骤:

  1. 分析带注释的元素并创建数据模型,以及
  2. 使用数据模型使用 JavaPoet 生成代码。

在大多数情况下,注释处理 API 为我们提供了 TypeMirror。从我在网上看到的情况来看,在数据模型中使用 TypeElement 似乎是一种很好的做法(可以从 TypeMirror 获得)。

然而,JavaPoet 在大多数情况下直接接受 TypeMirror,并且将它们转换为数据模型的 TypeElement 似乎是不必要的。

作为数据模型,一个与另一个相比有优势吗?

最佳答案

类型代表不同的抽象层次。 TypeElement 表示在代码中声明的类,而 TypeMirror 表示该类的具体用法。

例如:

class Foo {
    public void hello() {
    }
}

class Bar {
    public void hello(Foo foo) {
    }
}

在此示例中,将有 2 个 TypeElement 实例 - 用于每个已声明的类。还将有 2 个 ExecutableElement 实例,代表每个方法(A.helloB.hello)。

如果您查看 B.hello()ExecutableElement,将会有关于方法参数及其类型的信息,而在本例中,类型将用 TypeMirror 表示。从TypeMirror你总能得到相应的TypeElement

TypeElement - 表示类声明并包含有关声明本身的所有信息

TypeMirror - 表示类在代码中的出现(特定用法),并具有特定于该出现的所有信息。从事件的发生来看,您总是可以获得声明,但反之则不然

尽管这两个实体(TypeElementTypeMirror)乍一看可能代表相同的实体,但事实并非如此。它们中的每一个都有一些信息,这些信息仅在特定的抽象级别上可用。

例如:声明的类或方法的注释 - 在相应的 TypeElement/ExecutableElement 中可用,但在 TypeMirror 中不可用。

差异的另一个重要方面是泛型:

class Foo<T> {
    public void hello() {
    }
}

class Bar {
    public void hello(Foo<String> foo) {
    }
}

在此示例中,Foo 的 TypeElement 将包含有关类型参数、它们的约束、边界等的信息。

但是 B.hello 的第一个参数的 TypeMirror 将具有特定类型的参数(String),在这个特定的Foo 类的使用

关于java - TypeElement 与 TypeMirror 作为 Java 注释处理器的数据模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69518703/

相关文章:

java - Eclipse 注释处理器不工作。哪里显示错误?

java - Java多线程中如何实现信号量概念?生产者消费者

java - 比较 Java 中的 Long 面临的一些问题

java - 同时使用 @Nonnull 和 Preconditions.checkNotNull(...)

java - 如果存在注释,我该如何执行某些功能?

java - Eclipse 3.5+ - 注释处理器 : Generated classes cannot be imported

java - 当我的文件位于正确的文件夹中时,为什么我一直从我的 catch 异常中获取 "File not found."?

java - 从 shell 脚本启动 java 程序

java - 无法在 Spring Security 中使用 @Secured Method Security 注释

java - 通过 Java 注解处理器创建基类