Android 编译时注解-初认识
背景
编译时注解越来越多的出现在各大开源框架使用中,比如
square/dagger 依赖注入
类似这样的库在开发和工作中已经越来越多,它们旨在帮助我们在效率为前提的情况下帮助开发者快速开发,节约时间成本。而它们都使用了编译时注解的思想。
正因为如此火热,所以有必要好好学习其中的实现原理,方便解决因为编译时注解导致的问题,同时可将此技术运用到自己的开源库中
思想
编译时注解框架在编写时有相对固定的格式,分包为例
格式相对固定,但是也可以灵活变动,比如讲api
和annotations
结合在一个moudel
里
moudel中
的依赖关系也非常的固定
processors
依赖包有api
-annotations
app
依赖包有api
-annotations
-processors
其中除了app
是Android moudel
以外,其他全部均是Java moudel
annotations
注解
在讲解annotations
注解之前,需要对java和android注解有大致的了解,可以参考我之前的博客
先初始一个HelloWordAtion注解标注Target为ElementType.TYPE
修饰类对象
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE)
public @interface HelloWordAtion {
String value();
}
一般一个注解需要对应一个注解处理器,注解处理器在processors
处理
processors
注解处理器
对应注解的处理器需要继承AbstractProcessor
类,需要复写以下4个方法:
init
init(ProcessingEnvironment processingEnv)
会被注解处理工具调用
param | mean |
---|---|
ProcessingEnvironment | 提供很多有用的工具类Elements, Types 和 Filer |
process
process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv)
这相当于每个处理器的主函数main(),你在这里写你的扫描、评估和处理注解的代码,以及生成Java文件。
param | mean |
---|---|
annotations | 请求处理的注解类型 |
roundEnv | 有关当前和以前的信息环境 |
@return | 如果返回 true,则这些注解已声明并且不要求后续 Processor 处理它们 |
@return | 如果返回 false,则这些注解未声明并且可能要求后续 Processor 处理它们 |