美文网首页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