AnnotationProcessor 没生成目标类?

开发 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
  1. 添加依赖,一定别忘了加 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'

}
  1. 给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 中的信息,报错信息还是比较准确的

也可以直接看生成目标类中,哪块语法有错去排查

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容