Abh*_*hek 4 java annotations annotation-processing
我正在开发一个带有注释处理的代码生成器,并将逻辑分为两个步骤:
注解处理APITypeMirror在大多数情况下为我们提供了。从我在网上看到的情况来看,TypeElement在数据模型中使用似乎是一个很好的实践(可以从 获得TypeMirror)。
然而,JavaPoet 在大多数情况下TypeMirror直接接受 s,并且将它们转换为TypeElement数据模型似乎没有必要。
数据模型与另一种相比是否有优势?
类型代表不同的抽象级别。TypeElement代表在代码中声明的类,而TypeMirror代表该类的具体用法。
例如:
class Foo {
public void hello() {
}
}
class Bar {
public void hello(Foo foo) {
}
}
Run Code Online (Sandbox Code Playgroud)
TypeElement在此示例中,每个声明的类都会有 2 个 - 实例。此外,还会有 2 个实例ExecutableElement,分别代表方法 (A.hello和B.hello) 中的每一种。
如果您查看 of ExecutableElement,B.hello()将会有有关方法参数及其类型的信息,而在本例中,类型将用 表示TypeMirror。从TypeMirror你身上总能得到相应的TypeElement。
TypeElement- 代表类声明并包含有关声明本身的所有信息
TypeMirror- 表示类在代码中的出现(具体用法),并具有特定于该出现的所有信息。从事件发生时你总是可以得到声明,但反之则不然。
尽管如此,乍一看,两个实体 (TypeElement和TypeMirror) 可能看起来代表相同的实体,但事实并非如此。它们中的每一个都有一些信息,这些信息仅在特定的抽象级别上可用。
例如:声明的类或方法的注释 - 在相应的TypeElement/中可用ExecutableElement,但在TypeMirror.
差异的另一个重要方面是泛型:
class Foo<T> {
public void hello() {
}
}
class Bar {
public void hello(Foo<String> foo) {
}
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,TypeElementFoo 将包含有关类型参数、它们的约束、界限等的信息。
但是TypeMirror的B.hello第一个参数将具有特定类型参数 ( ),该参数在使用类String的特定情况中使用Foo