现在很多三方库使用了apt技术,使得我们能够在编译的时候就获得代码的信息,从而能够根据现有的代码生成一些新的代码,比如ButterKnife就会生成Activity,从而免去了去写重复的findViewById函数;Glide在编译的时候会获取GlideModule
注解的类,从而在配置Glide的一些参数;还有我这里推荐一个省去写Parcelable序列化内部每个成员的write/read方法的库ParcelableGenerator,这个库也是使用另外apt技术,在编译的时候生成一个类,运行时用这个类来进行实际的序列化,归根到底最后还是要生成代码,下面来看如何生成代码。
demo地址:https://github.com/whoami-I/Learn_Annotation
一、环境的搭建
我在搭环境的时候总是遇到报错的问题,总是说gradle版本太高不支持本地的代码增量,我后来把gradle版本降低到4.4就好了,反正是用来学习的,因此gradle降低就降低吧。然后建两个java module,之所以是java module因为android module并不是包括全部java中的类,我们编写编译时注解代码的类在android module中是找不到的,建立两个module分别是ioc-compiler和ioc-annotation,compiler主要处理生成代码的逻辑,annotation里面包含需要使用到的注解,然后在测试模块,这里是主模块app中添加依赖:
implementation project(':ioc-annotation')
annotationProcessor project(':ioc-compiler')
然后开始写代码了,这里我们准备写一个类似于Butterknife的功能,提供id注入和点击事件注入,在ioc-annotation模块中分别建立两个注解
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.FIELD)
public @interface BindView {
int value();
}
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.METHOD)
public @interface OnClick {
int value();
}
这个就不多说了,需要注意的是两者注解的生命周