1.APT注解处理器
APT全称Annotation Processing Tool,即注解处理器,它在代码编译时扫描和处理注解,即对源代码文件进行检测找出其中的注解,然后使用注解进行额外的处理,比如生成处理注解逻辑的Java文件等。
ButterKnife、EventBus、ARouter、GreenDAO都使用了APT技术。在ARouter框架中,路由表的生成过程就使用了APT技术,路由表就是在运行时生成用于帮助填充WareHouse路由元信息的类。
APT的作用时间是编译时。Android中代码编译流程:Java—>class —> dex,代码最终生成dex文件打入到APK包里面。
①APT是在编译开始时就介入的,用来处理编译时注解。
②AOP(Aspect Oridnted Programming)是在编译完成后生成dex文件之前,通过直接修改.class文件的方式,来对代码进行修改或添加逻辑。常用在代码监控、代码修改、代码分析这些场景。
使用APT可以在编译时处理注解,有如下效果:
①可以达到减少重复代码手工编写的效果。如ButterKnife,可以直接使用注解来减少findviewbyid这些代码,只需要通过注解表示是哪个id就够了。
②获取注解及生成代码都是在代码编译时候完成的,相比反射在运行时处理注解大大提高了程序性能。
注意:APT并不能对源文件进行修改,只能获取注解信息和被注解对象的信息,然后做一些自定义的处理。
宏观上理解,APT就是javac提供给开发者在编译时处理注解的一种技术;微观上,具体到实例中就是指继承自AbstractProcessor的实现类,即一个处理特定注解的处理器。
2.APT原理
在Java源码到class文件之间需要经过注解处理器的处理,注解处理器生成的代码也同样会经过这一过程,最终一起生成class文件。在Android中,class文件还会被打进Dex文件中,最后生成APK文件。
注解处理器的执行是在编译的初始阶段,并且会有多个processor。查看所有注册的processor:build/intermediates/annotation_processor_list/debug/annotationProcessors.json。
自定义一个注解处理器TestProcessor:
@AutoService(Processor.class)
@SupportedAnnotationTypes({"com.demo.test_annotations.TestAnnotation"})
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class TestProcessor extends AbstractProcessor {
Filer mFiler;
Types types;
Elements elementUtils;
Messager messager;
@Override
public synchronized void init( ProcessingEnvironment processingEnv){
super.init(processingEnvironment);
mFiler = processingEnv.getFiler();
types = processingEnv.getTypeUtils();
elementUtils = processingEnv.getElementUtils();
messager = processingEnv.getMessager();
}
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnvironment) {
if