開發(fā) 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 會找不到對應注解伤靠。另外,重寫優(yōu)先級 > 注解啼染,也就是注解寫對了,但是重寫方法寫錯的話焕梅,還是有可能失敗
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的參數(shù)一定要寫死 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
其他
以上兩部分內容全部檢查完畢后捶闸,類應該能妥妥地出來了,現(xiàn)在再扯一下調試技巧
Log
很多介紹AnnotationProcessor 的 blog 說到
AnnotationProcessor是運行在 javac 期間拖刃,不能用 System.out.print 打印删壮,推薦用 processingEnv.getMessager().printMessage
但是筆者親測,System.out可行兑牡,但是用 processingEnv.getMessager() 功能更強大央碟,可以區(qū)分Log類型,且Log Error類型時均函,會直接終止程序
排查錯誤
每次修改完 Processor 代碼后亿虽,可以點擊 AndroidStudio build task(右側邊欄Gradle),然后看 console 中的信息苞也,報錯信息還是比較準確的
也可以直接看生成目標類中经柴,哪塊語法有錯去排查