android的APT技术

转载请标明出处:http://77blogs.com/?p=199

APT 是Annotation Processing Tool 的简称。

它是注解处理器,在处理Annotation时可以根据源文件中的Annotation生成额外的源文件和其它的文件(文件具体内容由Annotation处理器的编写者决定),APT还会编译生成源文件和原来的源文件,将它们一起生成class文件。
简言之:APT可以根据注解,在编译时生成代码。

事实上它是javac的一个工具,命令行运行javac后便可以看到:

接下来我们就来实现一个apt的实例,类似于ButterKnife中@BindView注解,基本步骤如下:

1、定义要被处理的注解。

2、定义注解处理器(生成具体的类)。

3、调用处理器生成的代码

 

对应的,我们在工程中需要有这几个模块:

1、app。测试我们的功能

2、apt-annotation。一个Java library module,放置我们自定义注解

3、apt-processor。一个Java library module,注解处理器模块

4、apt-sdk。一个Android library module,通过反射调用apt-processor模块生成的方法,实现view的绑定。

工程目录如下:

1、在apt-annotation中自定义注解:

2、apt-processor中引入依赖,它需要依赖apt-annotation,同时还需要依赖auto-service第三方库,后面创建注解处理器的时候需要用到。

apt-processor/build.gradle文件中:

3、在pat-processor中创建注解处理器:

处理器需要继承AbstractProcessor,注意该module是 java module,如果创建的是android module的话那么就会找不到AbstractProcessor

需要注意的是代码中不能有中文,否则编译不通过,我这里为了方便注释解释加上了中文。

 

ClassCreatorFactory的代码如下,这个类负责提供需要写入新的类的代码:

先不谈apt-sdk模块,我们先来看看生成的代码是怎么样的。

在app的gradle中引入:

特别要注意的是apt-processor模块的依赖引进要用 annotationProcessor,否则编译报错

 

两个activity中:

rebuild一下便可以看到在这个目录下有我们生成的文件了。

gradle高版本出现编译后没出现文件的问题,无奈只好降低版本,我使用的版本是gradle  3.1.4 +  gralde_wrap  gradle-4.4-all.zip

点进入其中一个可以看到是这样的代码:

所以我们只要调用bindView就能够找到该view了,这也是apt-sdk要做的事情。

 

4、在apt-sdk中创建类,反射调用生成的类中的方法

5、app的gradle中引入apt-sdk,然后代码调用DataApi的方法

app的MainActivity中实现

这样就大功告成了

源码地址:https://github.com/TZHANHONG/AptAutoBindView

发布者

大道苍莽,一笔一墨,皆重之。

发表评论

电子邮件地址不会被公开。