@SupportedAnnotationTypes({"com.tg.annotation.Name", "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());
}
这段代码第一次在Intellij上build(即编译输出目录还不存在) 会输出:
annotations size 2
annotations size 0
从输出中可以看到processor得到了被@Name
和@Test
这两个注解的类的信息,但是下面那行就有疑问了,javac的过程中干了什么,似乎多次执行了process
方法?
此时我再次build,没有任何输出。猜测是没有改动任何源代码,javac就不执行了process了?接下来我修改了一个被@Name
注解的类,build 输出annotations size 1
processor 得到了被@Name
注解的类信息,没拿到@Test
的信息.看起来似乎是修改了源代码,javac才会把这些信息提供给processor?求大神解答。当然,我删除编译输出目录再编译会完全重新编译,是可以得到结果的。
那么考虑这个场景,我通过得到所有的被@Name
和@Test
注解的类的信息,要生成一个txt文件,而且这个文件会随时根据你源代码的改动,自动生成最新的版本。如果我只修改了一个类,那么processor只得到了修改后的类的信息,得不到其他类的信息,这样我没办法生成一个最新版本的txt文件(不考虑这种方式:读取txt文件,拿修改后的信息去修改这个原来的txt文件中需要被修改的部分)
class文件变更则process