当前位置: 首页 > 知识库问答 >
问题:

在注释处理器上编译时检查类层次结构

越星晖
2023-03-14

我正在编写一个注释处理器来在编译时执行以下检查:

  • 有一个接口E
  • 有一个注释<code>Apply<code>用于注释方法
  • @Apply注释的方法应被称为Apply,并且只取实现E

到目前为止,我已经识别了所有名为< code>apply的带注释的方法,并提取了它们作为参数的类名。所以我只剩下:

 Element method  // this is the Element that represents the `apply` method
 TypeMirror mirror //method's TypeMirror
 String paramClass // the parameter's class Name.

问题是:如果有的话,我如何才能从中获得参数的类层次结构表示,以便检查它是否实现了E。无法使用<code>类加载器。loadClass,因为该类还不存在,但我只需要类层次结构。

共有1个答案

夏宪
2023-03-14

使用<code>javax.lang.model.util.Types有一种简单的方法。isSubtype()方法:

 TypeMirror parameterTypes = mirror.getParameterTypes();
 TypeMirror typeOfE = processingEnv.getElementUtils().getTypeElement(E.class.getName()).asType();
 boolean isSubTypeOfE = processingEnv.getTypeUtils().isSubtype(parameterType, eventType)

这样,我就可以检查<code>mirror</code>表示的方法的参数类是否是所需类型<code>E</code>的子类型

 类似资料:
  • 我有以下Spring Boot类,用自定义注释注释: 注释定义如下: 我想要的是编写一个注释处理器,有效地使我的控制器像下面的代码一样工作。 我已经能够在运行时通过反射实现这一点,但这大大延长了启动时间。有没有办法只使用注释和自定义注释处理器来实现上述功能?换句话说,我想创建一个注释,将带注释的方法添加到类中,并将任意方法调用添加到现有方法中。 我知道注释处理并不真正支持修改源代码。我有兴趣知道任

  • 我正在尝试创建一个自定义注释,例如,确保字段或方法既是又是,如果字段或方法既不是又不是,则会生成编译时错误,如以下示例所示: 到目前为止,我已经完成了两个自定义注释接口: 和: 正如所暗示的,我不知道如何生成编译时错误。Processor的文档清楚地表明我不应该抛出异常, 如果处理器抛出未捕获的异常,该工具可能会停止其他活动注释处理器。 它接着描述了当提出错误条件时会发生什么,现在是如何提出错误条

  • 问题内容: 我正在尝试创建一个自定义批注,例如,以确保字段或方法为and ,并且如果该字段或​​方法不为and ,则将生成编译时错误,如以下示例所示: 到目前为止,我已经完成了两个自定义注释接口: 和: 如所示,我不知道如何生成编译时错误。Processor 的文档清楚地表明,我不应该抛出异常, 如果处理器抛出未捕获的异常,则该工具可能会停止其他活动的注释处理器。 它继续描述了引发错误条件时会发生

  • null 代码(步骤1和2): 实际上,第一个任务执行良好,并为注释处理器实现编译.class文件。它在第二个任务停止。 Ant说: Java 1.6 Ant 1.8.2

  • 我在注释中创建一些元数据结构时遇到了问题。我们使用注释来定义Hibernate实体属性的特殊属性,但它可能在任何地方都可以使用。我想创建表示这些结构的条件: 问题是我需要使用此注释定义一些“树”结构。这是我想达到的一些设计: 我想根据这个例子使用的所有这些注释: 我知道我在上面的注释定义中定义的那种继承是不可能的。但是,我该如何考虑我的注释和,或是在一个“家庭”中?

  • 那么,这是一种好的做法吗?有什么缺点吗?如果它像我现在看起来的那么好,为什么没有很多库以一种简单的方式来做到这一点(我找到的唯一一个是类索引)?相反,对于运行时处理,有这么多?