这节主要学习一下如何使用AbstractProcessor来开发自己的注解处理器。在此之前需要了解AbstractProcessor的一些基本知识,如果忘了可以再回到<<注解处理器1 - AbstractProcessor>>这篇文章看看。

开发准备

首先是开发环境,不同的环境引入的插件可能有所不同。本节学习使用的环境如下:

IDE:Android Studio

语言:Kotlin,java

插件及库:kapt,java-library,AutoService

另外,我们需要搞清一些概念,理清它们之间的关系,对理解自定义注解的开发很有帮助。

AbstractProcessor:它由Java Annotation Processing API 提供,在javax.annotation.processing包中。它是抽象类,通过继承AbstractProcessor来方便的实现自定义注解处理器,主要的代码在其子类中实现。

java-library:gradle 的java-library插件用于构建打包java库,它提供了一些功能让开发者开发和管理java库更加简单,如将库打成jar包,管理构建流程,编译注解处理器,管理依赖等。如果没有java-library插件,AbstractProcessor这个类就找不到。利用java-library可以把注解管理器编译成库并分发出去。

AutoService:是Google开发的一个自动生成SPI(Service Provider Interface)清单文件的框架。它自动生成清单文件,不需要开发者再手操作。

需要在自定义注解库中引入依赖,如:

annotationProcessor 'com.google.auto.service:auto-service:1.0-rc7'
implementation 'com.google.auto.service:auto-service:1.0-rc7'

如果没有AutoService,则开发者需要在resource/META-INF/services 文件夹下创建一个以服务接口全命名的文件,文件内容为具体实现的类完整名。例子:

服务接口为: com.demo.IcurstomInterface

接口的实现类是: com.demo.Imp_curstom1, com.demo.Imp_curstom2

创建的文件就是:resource/META-INF/services/com.demo.IcurstomInterface

com.demo.IcurstomInterface 这个文件的内容就是: