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

Abh*_*hek 4 java annotations annotation-processing

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

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

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

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

数据模型与另一种相比是否有优势?

Den*_*ich 9

类型代表不同的抽象级别。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.helloB.hello) 中的每一种。

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

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

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

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

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

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

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

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

Run Code Online (Sandbox Code Playgroud)

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

但是TypeMirrorB.hello第一个参数将具有特定类型参数 ( ),该参数在使用类String的特定情况中使用Foo