gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:57:06 32 4
gpt4 key购买 nike

我正在开发一个带有注释处理的代码生成器,并将逻辑分为 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com