程序员自我修养之APT篇
一、APT作用的范围以及缺点:
APT = 注解 + 注解处理器(AbstractProcessor)
作用范围:基于java文件去修改为java文件
缺点:生成新的文件需要去使用,代码具有侵略性
二、注解的类型以及应用
Source : APT ------>编译时注解处理器
Class : 插桩 ------->编译后处理筛选
Runtime : 反射-------->运行时动态获取注解信息
![](https://img.haomeiwen.com/i16293373/1056aeae24fae40a.png)
三、常见注解器的使用
SupportedAnnotationTypes : 用来过滤处理哪种注解
在builde.gradle里面加上这句话
annotationProcessor project('') ----->这个是倒入你写的那个包
annotationProcessor project('存储路径')
SupportedOptions:这个是再编译时可以动态去获取参数
在builde.gradle里面加上这句话
javaCompileOptions.annotationProcessorOptions.arguments = [module : project.getName() ]
然后代码里processingEnvironment.getOptions().get("module") 可以动态获取
SupportedSourceVersion :支持编译的版本
四、Element常用元素以及API的接口
![](https://img.haomeiwen.com/i16293373/d5d65c90e27a4a71.png)
APT的Element元素常用变量
![](https://img.haomeiwen.com/i16293373/055cb598d4b77423.png)
五、APT常用API的方法
拿到当前的Element可以拿到它的下一个,直到为ExecuteableElement或VariableElement止
对getEnclosedElements() :Package(包)->Type(类)->{Variable(属性)、Executeable(方法)}
拿到当前的Element可以拿到它的上一个,直到为PackageElement止
对getEnclosingElement() : {Executeable(方法)、Variable(属性)}->Type(类)->Package(包)
![](https://img.haomeiwen.com/i16293373/88dfb8686b62a3f8.png)
六、APT实现Activity、Fragment、Dialog实现数据绑定
![](https://img.haomeiwen.com/i16293373/a4249dde29dee372.png)
这个注解是向Javac里面注册自己定义的注解
import javax.annotation.processing.Processor;
@AutoService(Processor.class)
![](https://img.haomeiwen.com/i16293373/7dc1ff8ca9760843.png)
![](https://img.haomeiwen.com/i16293373/4dd79c4292fc4fb5.png)
网址:https://www.jianshu.com/p/899063e8452e 或者去参考java的注解文档
![](https://img.haomeiwen.com/i16293373/57e4e1fa1ee9bfc8.png)
![](https://img.haomeiwen.com/i16293373/96e137739d805e64.png)
七、APT优化方案
![](https://img.haomeiwen.com/i16293373/f9b6675aa42d6f75.png)
![](https://img.haomeiwen.com/i16293373/16da3e2793d348f6.png)
![](https://img.haomeiwen.com/i16293373/c09659873d447202.png)
执行iRouter.putActivity这个方法,说明key("likeActivity") -- value(LikeActivity) 映射成功