Anroid APT

前言

APT:Annotation Processor Tool(注解处理器)

什么时注解处理器

注解处理器是(Annotation Processor) 是Javac的一个工具,其作用在编译期间,用来处理加了注解的代码,其会扫描编译其的源码获得加了特定注解的目标代码; 注解处理器的输入数据为:

  • 1、java代码或者编译过的字节码

输出数据为

  • 1、java文件(生成的java文件不能修改,其将与手动编写的java代码一起参加javac的编译过程)

注解处理器处理流程小结:

1
2
graph TD
    标记了注解的类 --> 注解处理器处理 --> 输出Java代码

注解处理器开发

定义注解处理器

实现自己的注解处理器,我们需要定义一个类去继承AbstractProcessor类

  • 处理器的写法有固定的套路,示例代码如下
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class MyProcessor extends AbstractProcessor {

    @Override
    public synchronized void init(ProcessingEnvironment processingEnv) {
        super.init(processingEnv);
    }

    @Override
    public Set getSupportedAnnotationTypes() {
        return null;
    }

    @Override
    public SourceVersion getSupportedSourceVersion() {
        return SourceVersion.latestSupported();
    }

    @Override
    public boolean process(Set annotations, RoundEnvironment roundEnv) {
        return true;
    }
}

方法说明

方法 说明 参数
init(ProcessingEnvironment processingEnv) 被注解处理工具调用 参数ProcessingEnvironment 提供了Element,Filer,Messager等工具
getSupportedAnnotationTypes() 指定注解处理器是注册给那一个注解的,它是一个字符串的集合,意味着可以支持多个类型的注解,并且字符串是合法全名。
getSupportedSourceVersion 指定Java版本
process(Set annotations, RoundEnvironment roundEnv) 这个也是最主要的,在这里扫描和处理你的注解并生成Java代码,信息都在参数RoundEnvironment 里了

注册注解处理器

定义好注解处理器之后,如何让构建系统在编译代码时调用我们的处理器呢?此时我们就需要将些好的处理器注册进构建系统的注解处理器集合里面了 1、低效方法: 打包注解处理器的时候需要一个特殊的文件 javax.annotation.processing.Processor 在 META-INF/services 路径下

1
2
3
4
5
6
7
--myprcessor.jar
----com
------example
--------MyProcessor.class
----META-INF
------services
--------javax.annotation.processing.Processor

javax.annotation.processing.Processor 记录的内容是我们要注册的注解处理器,例如

1
2
com.example.myprocess.MyProcessorA
com.example.myprocess.MyProcessorB

2、优雅方法: google提供了一个注册处理器的库:

1
compile 'com.google.auto.service:auto-service:1.0-rc2'

直接在自定义的注解类上使用@AutoService(Processor.class):

1
2
3
4
@AutoService(Processor.class)
public class MyProcessor extends AbstractProcessor {
      ...
}