Android 中的APT
一、什么是APTAPT(Annotation Processing Tool 的简称),可以在代码编译期解析注解,并且生成新的 Java 文件,减少手动的代码输入。现在有很多主流库都用上了 APT,比如 Dagger2, ButterKnife, EventBus3 等
本文通过实现简单的ButterKnife控件绑定介绍APT的内容
二、AbstractProcessor
在编译时编译器会检查AbstractProcessor的子类,并且调用该类型的过程函数,然后将添加了注解的所有元素都传递到处理函数中,使得开发人员可以在编译器进行相应的处理,例如,根据注解生成新的的Java类,这也就是ButterKnife,改造,牵引等开源库的基本原理。Java的API已经提供了扫描源码并解析注解的框架,我们可以继承AbstractProcessor类来提供实现自己的解析注解逻辑。
如何使用Processor
1.新建java-libreary才可以使用Processor哦
// 自动注册processor的类库谷歌出品
implementation'com.google.auto.service:auto-service:1.0-rc2'
//javapoet 生成java代码的类库
implementation'com.squareup:javapoet:1.7.0'
2.在项目中引入processor
annotationProcessor project(':java工程')
annotationProcessor是APT工具中的一种,他是google开发的内置框架,不需要引入,可以直接在build.gradle文件中使用,如下
创建一个Processor类继承AbstractProcessor
声明一个自定义Process
process 方法会在编译时被调用,set集合存放着所有被@SupportedAnnotationTypes()标记的注解的Element(例如:所有被BundView注解的View的信息包括全类名,父Element这这里为activity);
编译时拿到所有的activity和View信息生产代码processElement处理element 保存所有activity 和 view的信息
createJavaFile 通过javapoet库就会在build->generated->source->apt目录下生产java文件
通过javapoet库生产java文件
生产的java文件
ButterKnife的bund方法就是通过类全名+_BundleView反射获取类对象实例化
bund文件
使用方法
使用方法
不要在意报红的地方,编译器问题。是不是和ButterKnife很相似的,其实ButterKnife也是这个原理,当然他的更加复杂。我这里只是简单的实现,让大家对APT技术有个了解,具体的还需要大家继续努力学习。
越努力越幸运,大家共勉