一,什么是APT
1.APT(Annotation Processing Tool) 是一种处理注释的工具, 它对源代码文件进行检测找出其中的 Annotation,使用 Annotation 进行额外的处理。
Annotation 处理器在处理 Annotation 时可以根据源文件中的 Annotation 生成额外的源文件和其它的文件 (文件具体内容由 Annotation 处理器的
编写者决定),APT 还会编译生成的源文件和原来的源文件,将它们一起生成 class 文件。APT主要是依赖了Java编译环节中的javac,我们在控制
台输入javac的时候会出现processor工具,这个就是APT处理程序的入口,简单的说就是Processor会在编译阶段初始化,然后对当前模块内的代
码进行一次扫描,然后获取到对应的注解,之后调用process方法,然后我们根据这些注解类来做一些后续操作,如下图1
图1
2. 为了更方便精准的了解这个流程,我们需要知道整个java的编译流程是什么样子的,如下图2
图2
上图是一张简单的编译流程图,compiler代表我们的javac(java语言编程编译器)。这张图应该中其实缺少了一个流程,在source -> complier的过程中就
应该把我们的Processor补充上去,图3
把两张图结合就是整个java的编译流程了。整个编译过程就是 source(源代码) -> processor(处理器) -> generate (文件生成)-> javacompiler -> .
class文件 -> .dex(只针对安卓)
3.APT中核心类以及接口 图4
图4
核心的类和接口 图5
图5
4.核心方法的讲解
ProcessingEnvironment
Filer 就是文件流输出路径,当我们用AbstractProcess生成一个java类的时候,我们需要保存在Filer指定的目录下。
Messager 输出日志工具,需要输出一些日志相关的时候我们就要使用这个了。
Elements 获取元素信息的工具,比如说一些类信息继承关系等。
Types 类型相关的工具类,processor java代码不同的是,当process执行的时候,class的由于类并没有被传递出来,所以大部分都行都是用element来代替了,
所以很多类型比较等等的就会转化成type相关的进行比较了。
类型相关的都被转化成了一个叫TypeMirror,其getKind方法返回类型信息,其中包含了基础类型以及引用类型。
process
@AutoService(Processor.class) public class MyProcess extends AbstractProcessor {
private Elements elementUtils; private Filer filer; Messager messager; private Name simpleName;
@Override public synchronized void init(ProcessingEnvironment processingEnvironment) { super.init(processingEnvironment); elementUtils = processingEnvironment.getElementUtils(); |