以下内容主要讲解EventBus、Retrofit、Dagger2、ButterKnife等流行第三方库都在使用的AnnotationProcessor技术.
一 AnnotationProcessor工作流程
通过解析在源码中使用注解标记的类/变量/方法,生成所需的工具类,以摆脱繁琐重复的手工代码.
注解(也被成为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。
用于标注注解的注解叫做元注解,用于描述注解的使用范围,生命周期,继承关系等.
二 注解通常在项目中有两种用处
- 运行时注解. 在程序运行时,通过反射机制拿到注解相关信息进行相关操作,效率不高.
- 编译时注解.在程序编辑阶段,通过注解获取相关信息,生成相应的工具代码.不影响运行时的效率.
三 项目为什么要使用APT
为了满足项目在不同场景中的需求,目前主要满足两个:
- 事件绑定与解绑.
原先事件通信是通过RxJava2,但是每次事件绑定和解绑都要手动操作,所以使用注解完成. - 页面信息携带.
最近两周的工作主要是使用注解完成页面跳转时信息的传递与解析.
借鉴Dart和ARouter项目,重复造轮子的原因是:
a. 需要默认传递一些页面信息.
b. 不能满足页面返回信息的打包及解析.
c. 自己写有利于拓展.
未来考虑实现h5与native的跳转.
四 技巧
- 运行时注解的解析器只能是Java-library.但是可以使用android相关的api.
- auto-service第三方库可自动生成Processor配置
- java-poet可通过Builder模式辅助生成Java文件.
MethodSpec 代表一个构造函数或方法声明。
TypeSpec 代表一个类,接口,或者枚举声明。
FieldSpec 代表一个成员变量,一个字段声明。
JavaFile包含一个顶级类的Java文件。
在编写解析器时,主要用到以下三个工具类:
private Filer filer; //文件相关的辅助类
private Elements elementUtils; //元素相关的辅助类
private Messager messager; //日志相关的辅助类
最重要的是Element元素,相当于 XML 中的 DOM 树,可以通过一个元素去访问它的父元素或者子元素。感想
APT不是特别高深的技术,它提供了一种在编译时解析注解并生成模版工具类的开发方式,挺异想天开,让人称奇的:)