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

在批注处理器中获取生成的批注的所有值

师赤岩
2023-03-14
for (AnnotationMirror annotation : field.getAnnotationMirrors()) {
    Map<? extends ExecutableElement, ? extends AnnotationValue> annotationValueMap = annotation.getElementValues();

    messager.printMessage(Diagnostic.Kind.WARNING, annotation.toString() + ":" + annotationValueMap.toString());
}
@MyAnnotation:{}
@MyAnnotation(max = 387, min = 66876, ...)
private Integer myField;
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.FIELD)
public @interface MyAnnotation {
  int max();

  boolean allowAuto();

  int min();
}

我已经多次清理编译了这个项目,处理器从来没有看到值。我在这里忽略了什么?处理器显然可以看到注释本身,但传递给它的参数是隐藏的。

共有1个答案

戈博易
2023-03-14

回想一下,注释处理器作为编译器的一部分,以称为“轮”的步骤运行。这个过程迭代运行,直到没有新的代码要编译,然后处理器得到最后一次运行的机会(对于这个答案不是必需的,但是对于更多的上下文很有帮助)。每轮只有新创建的类型直接交给处理器检查。

这里似乎发生的是,在一个回合中,您发出了一个新的注释类型,它应该允许处理器观察提交要编译的某些代码的某些特性。但是,在给定轮中创建的任何类型在下一轮开始之前都不会编译。

对于这个问题,我们在这里遇到了一个冲突--一些Java源代码编译时使用了一个还不存在的注释。处理器首先创建注释,然后尝试从那些部分编译的源中读取新创建的注释。不幸的是,在注释编译完成之前,我们实际上无法读取注释。相反,我们需要等到下一轮(一旦注释本身编译完毕),然后回到已经完成编译的那个类并检查它。

 类似资料:
  • 我目前正在尝试用Kotlin为Android编写一个注释处理器。项目结构如下: 项目/构建.gradle 注释/build.gradle 样品/build.gradle Annotation.kt AnnotationProcessor.kt 使用kapt,构建在示例javaPreCompileDebug上中断,并显示以下消息: 当我用注释处理器替换 kapt 时,构建在示例:转换类上中断了以下消

  • 主要内容:使用Rem语句注释,注释使用::声明为创建的脚本添加注释或文档总是一个好习惯。 这是一个维护脚本用来理解脚本实际所做的事情所必需的注释。 例如,考虑下面这段没有注释形式的代码。 如果一个没有任何注释的脚本,普通人试图理解脚本,那么需要很多时间来理解脚本做些什么工作。 使用Rem语句注释 有两种方法可以在批处理脚本中创建注释; 一个是通过命令。 语句后的任何文本都将被视为注释,不会被执行。 以下是此声明的一般语法。 语法 其中是需要添

  • 注册表是Windows系统的关键要素之一。 它包含有关操作系统各个方面的大量信息。 几乎所有安装在Windows系统上的应用程序都以某种形式与注册表交互。 注册表包含两个基本元素:键和值。 注册表项是与文件夹类似的容器对象。 注册表值是与文件类似的非容器对象。键可能包含值或其他键。 使用类似于Windows路径名称的语法来引用键,并使用反斜杠来指示层次结构的级别。 本章介绍查询值,添加,删除和编辑

  • 15:59:55,223 INFO[stdout](默认任务-9)@edu.psu.swe.fortress.poc.interceptor.fortressprotected(permissions=[])15:59:55,229 INFO[stdout](默认任务-9)@edu.psu.swe.fortress.poc.interceptor.fortressprotected(permiss

  • 问题内容: 我有许多带有JAXB批注的实体,我想使用消息转换器将其转换为JSON。 我知道读取JAXB批注的ObjectMapper可以工作: 但是当我打电话给我的休息服务时,默认注册的MappingJacksonHttpMessageConverter(未配置为读取JAXB)似乎接管了- 由于@XmlTransient被忽略时由于循环引用而导致堆栈溢出… 如何配置Spring以使用Mapping

  • 我有以下工作查询 它在整个路径=/content/dam上运行,所以它遍历所有节点大约20分钟,并给出结果。 当以编程方式使用查询生成器api时,我如何才能批量使用它,比如-遍历1000个节点并按代码执行某些操作,然后继续查询并遍历下1000个节点等等?这可能吗? 谢谢。