前言
日常开发过程中使用过 APT 注解处理器技术的地方很多,比如 阿里的 ARouter,GreenDao 数据库,谷歌官方的 Dagger2,Hilt 框架。使用方式极其简单,只需要添加注解即可。那么 APT 注解处理器到底是怎么根据注解就能生成代码的呢?本篇文章就先带大家先来看看 APT 注解处理器是怎么注册的。
创建自定义注解
首先创建一个 java 类型的模块annotation,用来提供给注解注册器使用的注解模块,这里创建了一个ExtractField 注解。
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.SOURCE)
annotation class ExtractField
注册注解处理器
- 创建一个模块名为compiler 的 java 类型的 module。注意这里一定是 java 类型,语言选 java 或 kotlin 都可以,可以根据自身情况选择。创建完 module 后,就可以开始注册了。这里分别使用两种不同的方式进行注册。
注册处理器
手动注册需要自己动手完成 APT 注解处理器的注册。而自动注册则借助第三方完成注册,手动注册容易出错,这里建议新手小白使用自动注册方式,操作简单。这里先来看看手动注册方式。
1. 手动注册
首先创建一个 java 类 Processor,继承于AbstractProcessor(),实现其中方法。然后在 compiler 模块的 main 目录下,创建 resources 资源目录,然后在创建 META-INF.services 目录。这里要注册 META-INF.services 是文件夹的名称,并不是文件名称。
Processor 类实现的方法如下:
/***
* 注解处理器处理的注解类型
*/
override fun getSupportedAnnotationTypes(): MutableSet<String> {
return mutableSetOf(ExtractField::class.java.name)
}
override fun getSupportedSourceVersion(): SourceVersion {
return SourceVersion.latestSupported()
}
接着在META-INF.services 目录下,创建文件名称为javax.annotation.processing.Processor文件。文件中写入定义注解处理器类的全类名 com.cms.compiler.Processor。注意文件名称为javax.annotation.processing.Processor,没有任何后缀。
com.cms.compiler.Processor
2. 自动注册
自动注册相对简单,这里借助谷歌官方的 autoService 插件完成 APT 注解处理器的注册,只需要添加一个AutoService注解即可完成注解处理器的注册。
compileOnly 'com.google.auto.service:auto-service:1.0'
annotationProcessor 'com.google.auto.service:auto-service:1.0'
添加完 autoService 依赖后,只需要添加注解即可完成注册。
@AutoService(Processor.class) //固定写法
@SupportedAnnotationTypes({"com.cms.annotation.ExtractField"}) //需要使用的注解
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class ARouterProcessor extends AbstractProcessor {
其中com.cms.annotation.ExtractField 是需要处理的注解全类名。@AutoService(Processor.class)则是固定写法。
总结
以上就是 APT 注解处理器的注册方式,从注册方式可以看出来,每一个注解对应一种注解处理器。日常开发过程中建议使用 autoService 自动注册方式,避免出现失误。接下来会通过一个小案例讲解如果通过注解处理器完成安卓控件的 findviewbyid。通过对小案例的讲解来让大家了解注解处理器的大致工作原理。