Android-ARouter原理解析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android-ARouter原理解析相关的知识,希望对你有一定的参考价值。

参考技术A

ARouter使用的是APT(Annotation Processing Tool)注解处理器,通过给对应的类添加注解,在编译器动态生成对应的路由表文件。这里以分析ARouter的RouteProcessor。在ARouter的使用配置上,需要给base库配置

然后给每个组件都配置annotationProcessor,如果使用kotlin,则使用kapt
接着给每个组件都配置上下面的内容:

这个配置主要是通过这个annotationProcessorOptions获取到key为AROUTER_MODULE_NAME的值,这个值其实就是module的name,这个的作用就是作为一个Root文件的命名的,因为一个module中可能会有多个group,而多个group归属于一个Root,而ARouter的做法就是将一个module作为一个Root。

Element 是一个接口,它只在编译期存在和Type有区别,表示程序的一个元素,可以是package,class,interface,method,成员变量,函数参数,泛型类型等。

它的子类包括ExecutableElement, PackageElement, Parameterizable, QualifiedNameable, TypeElement, TypeParameterElement, VariableElement。

Element的子类介绍:

ExecutableElement:表示类或者接口中的方法,构造函数或者初始化器。

PackageElement :表示包程序元素

TypeELement:表示一个类或者接口元素

TypeParameterElement:表示类,接口,方法的泛型类型例如T。

VariableElement:表示字段,枚举常量,方法或者构造函数参数,局部变量,资源变量或者异常参数。

Element只在编译期可见

asType(): 返回TypeMirror,TypeMirror是元素的类型信息,包括包名,类(或方法,或参数)名/类型。TypeMirror的子类有ArrayType, DeclaredType, DisjunctiveType, ErrorType, ExecutableType, NoType, NullType, PrimitiveType, ReferenceType, TypeVariable, WildcardType ,getKind可以获取类型。

equals(Object obj): 比较两个Element利用equals方法。

getAnnotation(Class<A> annotationType): 传入注解可以获取该元素上的所有注解。

getAnnotationMirrors(): 获该元素上的注解类型。

getEnclosedElements(): 获取该元素上的直接子元素,类似一个类中有VariableElement。

getEnclosingElement(): 获取该元素的父元素,如果是PackageElement则返回null,如果是TypeElement则返回PackageElement,如果是TypeParameterElement则返回泛型Element

getKind():返回值为ElementKind,通过ElementKind可以知道是那种element,具体就是Element的那些子类。

getModifiers(): 获取修饰该元素的访问修饰符,public,private。

getSimpleName(): 获取元素名,不带包名,如果是变量,获取的就是变量名,如果是定义了int age,获取到的name就是age。如果是TypeElement返回的就是类名。

getQualifiedName():获取类的全限定名,Element没有这个方法它的子类有,例如TypeElement,得到的就是类的全类名(包名)。

具体的注解处理流程如下:

首先,看下属性注解处理器生成的文件示例:

AutowiredProcessor这个注解处理器的目的,就是通过这个注解处理器给对应的类中的属性进行赋值的操作。
AutowiredProcessor注解处理器流程:

以上是关于Android-ARouter原理解析的主要内容,如果未能解决你的问题,请参考以下文章

Bagging原理解析

Zookeeper原理解析

Kubernetes Service原理解析

WebRTC原理解析

SpringBoot Starter运行原理代码解析

【转载】AlphaGo原理解析