2017-08-06 127 views
0
@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关于Java AbstractProcessor的一些问题?

我干净的输出目录和在建的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 Processor可以获得所有班级的信息。

+0

问题不明确,请参见[问]。 – EJoshuaS

+1

您应该阅读['Processor']的文档(http://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html)。它有更多的细节,并解释了这种事情。 – Radiodef

回答

1

这是很难回答,当你一次问多个问题(并且这样做是against StackOverflow policies)......让我们用更少的相关问题,首先做掉:

为什么会有拖行? javac做了什么?

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

和我重建它没有输出

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

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

我修改注释@Table类和重建,输出标注尺寸1

不要使用process第一个参数的任何指示。如果您需要获取带注释的元素,请致电getElementsAnnotatedWith查看您感兴趣的每个注释。

我想获得类信息注解@Table和@测试,使用它们来生成一个XML文件

您还没有描述你的处理器和@Table@Test注释目的的确切目标,但是如果其中一个类引用了另一个类(例如@Table-annated类包含@Test -annotated类型的方法签名),则可以使用getTypeElement来访问该类,即使它没有被getElementsAnnotatedWith返回。