美文网首页Android开发
AnnotationProcessor 没生成目标类?

AnnotationProcessor 没生成目标类?

作者: Android_ZzT | 来源:发表于2020-03-28 01:16 被阅读0次

    开发 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 中的信息,报错信息还是比较准确的

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

    相关文章

      网友评论

        本文标题:AnnotationProcessor 没生成目标类?

        本文链接:https://www.haomeiwen.com/subject/ycbduhtx.html