java - 有关 Java AbstractProcessor 的一些问题?

标签 java annotations annotation-processing

@SupportedAnnotationTypes({"com.tg.annotation.Table", "com.tg.annotation.Test"})
public class TgDaoGenerateProcessor extends AbstractProcessor {
    private Messager messager;

    @Override
    public synchronized void init(ProcessingEnvironment processingEnv) {
        super.init(processingEnv);
        messager = processingEnv.getMessager();
    }

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        messager.printMessage(Diagnostic.Kind.NOTE, "annotations size " + annotations.size());
}

在我的项目中有一个注释为 @Table 的类和一个注释为 @Test 的类

我清理输出目录并在 Intellij 中构建,输出两行:

annotations size 2
annotations size 0

为什么有两条线? javac 做了什么?

如果我重建它,则不会打印任何内容。我想我不修改源代码,所以 javac 不会生成新的 .class 。如果我修改一个用@Table注释的类并重建,输出为:annotations size 1 。 APT获取@Table信息,无法获取 @Test带注释的类信息,因为我不修改带注释的类 @Test

我想获取带注释的类信息 @Table@Test并使用它们生成 xml 文件。举个例子:A类注释为@Table B 类注释为 @Test APT将获取A类和B类的字段和方法,然后将它们写入一个新文件中。因此,如果只修改类 A ,更改一些字段和方法。构建和 APT 处理器无法获取注释为 @Test 的类 B ,缺少这些信息我无法生成最新的 xml 文件。当然,我清理输出目录并重建,它会起作用,但没有人愿意这样做。那么改变任何一个类,如何让APT处理器可以获取所有类信息。

最佳答案

当您同时提出多个问题时很难回答(这样做是 against StackOverflow policies )......让我们先解决不太相关的问题:

why have tow line ? what have javac done?

这是由于多轮处理造成的。需要多轮处理由注释处理器生成的类注释。请参阅documentation of Processor了解详情。

and I rebuild it nothing output

不要依赖这个。您还没有指定您的构建系统(IntelliJ Ant?Maven?Gradle?)不同的构建系统以不同的方式处理增量编译,并且当项目使用注释处理器时,其中一些可能会完全禁用增量构建。最值得注意的是,Android Gradle 插件和 Gradle 本身的最新版本 have disabled增量编译来解决与注释处理器兼容性差的问题。

如果您需要简单的方法,请让注释处理器的用户也禁用增量编译。或者,您可以重新设计处理器以与增量编译兼容。这是一项复杂的任务,如果您对此感兴趣,我建议您提出一个单独的问题。

I modify a class annotated @Table and rebuild, output annotations size 1

不要使用 process 的第一个参数作为任何事物的指示。如果需要获取带注释的元素,请调用getElementsAnnotatedWith对于您感兴趣的每个注释。

I want to get class info annotated @Table and @Test, use those to generate a xml file

您还没有描述您的处理器的确切目标以及 @Table 的用途和@Test注释,但如果其中一个类引用另一个类(例如 @Table 带注释的类在其方法签名中包含 @Test 带注释的类型),则可以使用 getTypeElement访问该类,即使 getElementsAnnotatedWith 没有返回它.

关于java - 有关 Java AbstractProcessor 的一些问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45528460/

相关文章:

java - Java 中的 Wordhunt 程序

java - 如何在运行时将 Java Enum 转换为 Json?

java - Eclipse - 注解处理器,获取项目路径

java - Gradle::在sourceSets中设置outputDir时找不到参数main()作为参数

Java 使用正则表达式解析 Wiki 语法

java - 接口(interface)、注解继承

java - 如何在Java中输入def注解

java - 在编译时访问VM参数

java - Lombok 注释在测试中未处理 - Bazel

java - 如何打包Akka项目