开发 AnnotationProcessor 没生成目标类,该查什么?
1. 检查 SupportedAnnotationTypes
设置 SupportedAnnotationTypes 有两种方式
- 使用注解
@SupportedAnnotationTypes("com.zzt.annotation.Test")
public class TestProcessor extends AbstractProcessor
- 重写 getSupportedAnnotationTypes
public class TestProcessor extends AbstractProcessor {
@Override
public Set<String> getSupportedAnnotationTypes() {
Set<String> set = new HashSet<>();
set.add("com.zzt.annotation.Test");
return set;
}
如果以上方式都没做,AnnotationProcessor 会找不到对应注解。另外,重写优先级 > 注解,也就是注解写对了,但是重写方法写错的话,还是有可能失败
2. 检查是否注册了注解类
使用 google auto-service
- 添加依赖,一定别忘了加 annotationProcessor,auto-service 的原理是找到被@AutoService标记的自己写的Processor,然后生成注册信息,如果没依赖 annotationProcessor 就没有注册信息,也就没有目标类生成
build.gradle 依赖
dependencies {
implementation 'com.google.auto.service:auto-service:1.0-rc5'
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc5'
}
- 给Processor添加 @AutoService(Processor.class) 注解,@AutoService的参数一定要写死 Processor.class,不要写自己的 Annotation.class
@AutoService(Processor.class)
public class TestProcessor extends AbstractProcessor
自己注册注解信息
src/main 中建立如下目录,一个字不能错
image.png
javax.annotation.processing.Processor new 一个File即可,文件名必须一致,文件中填写自定义Processor的包名类名,如有多个Processor,用换行分割
com.zzt.apt.TestProcessor
com.zzt.apt.FooProcessor
com.zzt.apt.BarProcessor
其他
以上两部分内容全部检查完毕后,类应该能妥妥地出来了,现在再扯一下调试技巧
Log
很多介绍AnnotationProcessor 的 blog 说到
AnnotationProcessor是运行在 javac 期间,不能用 System.out.print 打印,推荐用 processingEnv.getMessager().printMessage
但是笔者亲测,System.out可行,但是用 processingEnv.getMessager() 功能更强大,可以区分Log类型,且Log Error类型时,会直接终止程序
排查错误
每次修改完 Processor 代码后,可以点击 AndroidStudio build task(右侧边栏Gradle),然后看 console 中的信息,报错信息还是比较准确的
也可以直接看生成目标类中,哪块语法有错去排查
网友评论