基本概念
APT 全称为 Annotation Processing Tool,可翻译为注解处理器,APT 工具是用于注解处理的命令行程序,它可以找到源码中对应注解的对象并使用注解处理器对其进行处理。
一般来说,我们会使用 APT 生成一些源码,然后加入编译目录进行编译,从而简化开发周期。
注解
注解处理器是基于注解(Annotation)的,实际开发中自定义注解用的比较少,这里先简单的复习下相关概念。
Java 注解是 Java1.5 中引入的概念,是用来标注代码的元数据。
定义一个注解
定义一个注解使用 @interface 关键字。
public @interface Test {
}
对,这样一个名为 Test 的注解就定义好了。
元注解
元注解是注解的注解,用来标注注解的元数据。
可以通过元注解来控制注解的一些属性与行为。
Java 中元注解共有四种:Retention、Inherited、Documented、Target。
Retention
Retention 表示注解的保留范围,取值为枚举类:RetentionPolicy,其中一共包括如下三个类型。
- SOURCE:注解只保留在源文件中,编译时就会把注解丢弃。
- CLASS:默认值,注解保留到 class 文件中,运行时会丢弃。
- RUNTIME:注解将会一直保留到运行时,可以通过反射获取到该注解。
Target
Target 用于控制注解的使用范围,取值为枚举类:ElementType。
- TYPE: 该注解作用于类,接口或枚举类上
- FIELD: 作用于类属性或对象属性也可以为枚举实例
- METHOD: 作用于函数
- PARAMETER: 作用于函数参数
- CONSTRUCTOR: 作用于构造器
- PACKAGE: 作用于包名
- LOCAL_VARIABLE: 作用于变量
- ANNOTATION_TYPE: 作用于注解
- TYPE_PARAMETER: Java 1.8 引入,作用于类型参数例如:
@Target(ElementType.TYPE_PARAMETER)
public @interface Test {
}
class TypeTest<@Test T>{
}
- TYPE_USE: Java 1.8 引入,作用于各种类型,也就是说,任何使用类型的地方都可以使用该注解。
@Target(ElementType.TYPE_USE)
public @interface Test {
}
public class A {
}
public class B extends @Test A {
public @Test int add(@Test int a, @Test int b) {
@Test int result = a + b;
System.out.println(result);
return result;
}
}
Documented
Documented 用于描述该注解是否需要加入到例如 javadoc 工具生成的文档的公共 API 中,使用 Documented 的注解将会被保留在生成的文档中。
Inherited
使用 Inherited 元注解的注解修饰的类,子类将会继承这个注解,这么说有点绕,举个栗子。
首先定义注解 Test,且使用 @Inherited 元注解修饰。
然后定义一个 Father 类,使用 @Test 注解修饰,再定义一个 Son 类继承了 Father 类,那么 Son 也会拥有注解 Test。
OK,注解就说完了,回归正题,开始介绍 APT。
APT
APT 的原理就是在需要使用的元素上(类、变量、方法、参数等)加上我们的注解,然后在编译时把使用了这个注解的元素都收集起来,做统一的处理,例如根据元素生成对应的工具类,以此提高开发效率。
创建一个注解处理器分为如下几步:
- 创建注解类
- 创建一个继承自 AbstractProcessor 的类,这就是 APT 的核心类
- 创建公开 API 及辅助工具
- 创建配置文件
- 使用
做