简介
更新20220221:最新版对dagger2.38.1源码解析
BasicAnnotationProcessor来源
implementation "com.google.auto:auto-common:0.10"
BasicAnnotationProcessor继承了AbstractProcessor,一个基础类注解处理器。
如果是一个简单的注解处理器,我们可以直接使用一个自定义AbstractProcessor处理对应的注解,可参考:Android循序渐进实现高逼格自定义ViewBinder。但是相对来说,dagger过于复杂,首先注解种类比较多:Inject,Component,ProductComponent,Provider,BindsInstance等;其次还需要针对注解进行校验,是否符合使用规范;并且逻辑代码也比较复杂,如果仅仅使用自定义AbstractProcessor也体现不了高质量代码的必要性。
BasicAnnotationProcessor代码质量非常高,里面的代码的写法非常值得我们学习借鉴。
源码思路整理
1.在BasicAnnotationProcessor中定义了一个Step接口,该接口用于处理某一类注解。代码如下:
public interface Step {//某一类注解集及其逻辑处理,该接口的实现者处理注解集的核心逻辑
//存储该类注解集合
Set<? extends Class<? extends Annotation>> annotations();
//annotations中的注解集合的逻辑处理:注解使用规范校验,注解代码生成
Set<? extends Element> process(SetMultimap<Class<? extends Annotation>, Element> elementsByAnnotation);
}
例如定义一个ComponentStep implements Step
表示处理Component相关注解逻辑:1.annotations()方法存放需要处理的注解集;2.process方法处理annotations()中注解集的逻辑代码,包括:校验,生成对应的逻辑代码。
2.BasicAnnotationProcessor是一个abstract抽象类,继承AbstractProcessor必然实现了以下方法:
(1) init(ProcessingEnvironment processingEnv):一些初始化操作,获取一些有用的系统工具类,该方法只会执行一次
(2) SourceVersion getSupportedSourceVersion() :BasicAnnotationProcessor并不知道继承者的版本,所以该方法没有实现,需要由继承者自己实现
(3) Set getSupportedAnnotationTypes():设置支持的注解类型,获取所有的Step接口annotations()方法中的注解集合,会执行多次
(4) boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment):注解内部逻辑的实现:1.会执行多次,并且调用process前一定会执行getSupportedAnnotationTypes()方法;2.process最后一次的执行roundEnvironment.processingOver() = true(前几次都是false),表示执行完毕
3.BasicAnnotationProcessor类定义了一个steps集合:ImmutableList<? extends Step> steps;
,它的三个方法都是围绕着steps操作:
(1)init初始化steps集合;
(2)getSupportedAnnotationTypes()注解类型,取自于steps的step.annotations()
(3)process,通过for循环,执行step.process,实际的每个step逻辑执行方法
源码解析
一.定义Step接口
BasicAnnotationProcessor中的方法都是围绕着Step实现者操作:
public interface Step {//某一类注解集及其逻辑处理,该接口的实现者处理注解集的核心逻辑
//存储该类注解集合
Set<? extends Class<? extends Annotation>> annotations();
//annotations中的注解集合的逻辑处理:注解使用规范校验,注解代码生成
Set<? extends Element> process(SetMultimap<Class<? extends Annotation>, Element> elementsByAnnotation);
}
二.init(ProcessingEnvironment processingEnv)方法
private ImmutableList<? extends Step> steps;
//一些初始化操作,获取一些有用的系统工具类
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
...
this.steps = ImmutableList.copyOf(initSteps());
}
protected Iterable<? extends Step> initSteps() {
throw new AssertionError(