我正在开发一个带有注释处理的代码生成器,并将逻辑分为 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.hello
和 B.hello
)。
如果您查看 B.hello()
的 ExecutableElement
,将会有关于方法参数及其类型的信息,而在本例中,类型将用 TypeMirror
表示。从TypeMirror
你总能得到相应的TypeElement
。
TypeElement
- 表示类声明并包含有关声明本身的所有信息
TypeMirror
- 表示类在代码中的出现(特定用法),并具有特定于该出现的所有信息。从事件的发生来看,您总是可以获得声明,但反之则不然。
尽管这两个实体(TypeElement
和 TypeMirror
)乍一看可能代表相同的实体,但事实并非如此。它们中的每一个都有一些信息,这些信息仅在特定的抽象级别上可用。
例如:声明的类或方法的注释 - 在相应的 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/