arouter之注解处理器

author author     2023-04-13     471

关键词:

参考技术A Arouter是阿里开源的一款Android组件化的路由框架。它可以实现一个项目中模块间解耦,实现模块在不依赖其他模块的情况下也可以与其他模块进行通信。
Arouter的使用不在此文章做接收,有兴趣到Arouter的github上查看其使用。
Arouter既然是路由框架,那么就少不了路由表,导航、服务等都依赖路由表,而路由表的生成是依赖注解及编译时注解处理器,在编译期间,路由注解器会解析路由注解信息,并按照规则、模板自动生成路由、路由表等java文件。

注解处理器是在编译期解析源码中的注解信息,在根据规则、模板自动生成相应的java文件,那么注解处理器是在编译期的哪个阶段执行呢?
下图是Android Gradle源码编译的大概流程:

Gradle源码编译是会调用javac的编译程序,接着调用程序中的注解器执行,执行注解器任务发生在源码真正编译之前。

Arouter目前提供的注解有以下三种:(其中Param被抛弃,推荐使用Autowried替换)

@Route的作用范围限定在类、接口、枚举及注解,生命周期为CLASS(只保留到编译器class文件中,jvm运行时被丢弃),参数有:

@Autowrited的作用范围是字段,生命周期为CLASS(只保留到编译器class文件中,jvm运行时被丢弃),参数有:

@Interceptor 的作用范围是类、接口、枚举及注解,生命周期为CLASS(只保留到编译器class文件中,jvm运行时被丢弃),参数有:

注解器抽象类是AbstractProcessor,一般自定义注解器都需要继承并实现其抽象方法,主要方法有:

注解器函数执行的流程是:构造方法——》init方法——》process方法

注解处理器中一些主要的类:

Element是一个接口,它只在编译期存在和Type是有区别的,Element表示程序的一个元素,如:package、class、interface、method、成员变量、函数参数、泛型类型等。它可以提供当前元素的类型信息,如:类型名称、字段名称、包等。
Element常见的子类有:

Element常见的函数有:

注解器处理器中编译器环境信息,可以提供文件生成器、类型处理工具类、元素处理工具类、日志打印等

注解处理器文件生成器,Arouter使用文件生成器配合使用squareup的javapoet库生成java源码文件

类型处理工具类

元素处理工具类

日志工具类

Arouter注解处理器有:RouteProcessor、AutowiredProcessor、InterceptorProcessor,它们都继承与BaseProcessor,而BaseProcessor继承于AbstractProcessor。

RouteProcessor是生成一个模块的路由表的注解处理器,模块的路由表包括:路由组表、每个路由组组内路由表。

根据上述对RouteProcessor源码解析,我们可以得出以下结论:
1、RouteProcessor注解处理器处理的是@Route注解
2、RouteProcessor会生成三类java文件,分别是:RouteRoot文件(每个模块一个,模块根路由表文件)、RouteGroup文件(每个模块存在多个分组,每个组对应一个RouteGroup文件)、Provider文件(每个模块一个,模块提供的服务表文件)

3、RouteProcessor是围绕@route的注解,解析生成RouteRoot、RouteGroup、Provider这三种文件,其流程:
3.1、从编译环境RoundEnvironment中读取所有被@Route注解修饰的元素列表
3.2、生成路由表文件RouteRoot的方法loadIntod的参数及名称
3.3、生成路由组文件RouteGroup的方法loadInto的参数及名称
3.4、生成路由组文件Provider的方法loadInto的参数及名称
3.5、遍历@Route注解修饰的元素列表
3.5.1、根据注解信息生成路由元信息对象RouteMeta,同时收集activity、fragment中需要依赖注入@Autowrited的参数类型及配置信息
3.5.2、对RouteMeta进行分组,把RouteMeta放入对应的路由组表groupMap中,组名使用注解中的group,如果为空则使用path中第一段//作为组名
3.6、遍历分好组的路由组groupMap
3.6.1、对provider进行过滤,并生成provider文件的方法及方法参数及方法内容;
3.6.2、同时生成每个路由组对应的RouteGroup文件中的方法及参数及方法内容
3.6.3、生成每个路由组对应的RouteGroup文件
3.6.4、将模块中的路由组RouteGroup进行归档到根路由表routeMap中
3.7、遍历根路由表routeMap生成根路由文件的loadInto方法的方法内容
3.8、根据生成provider的loadInto方法、方法参数、参数名称、方法内容生成provider文件
3.9、根据生成根路由的loadInto方法、方法参数、参数名称、方法内容生成根路由文件RouteRoot

AutowiredProcessor注解处理器是用来生成依赖注入工具类,对被@Autowrited注解修饰的字段进行赋值,我们先分析其源码:

arouter使用自定义注解处理器,自动生成跳转activity的代码,避免手动填写和管理path(代码片段)

大家都知道ARouter要跳转目标Activity需要两步:1.在Activity上添加Route注解//Addannotationsonpagesthatsupportrouting(required)//Thepathhereneedstopayattentiontoneedatleasttwolevels:/xx/xx@Route(path="/test/activity")publicclassYourActivityextendActivity...2.执... 查看详情

框架手写系列---apt方式实现arouter框架(代码片段)

...原理,十分简单:用注解标识各个页面,注解处理器将该注 查看详情

android-arouter原理解析

参考技术AARouter使用的是APT(AnnotationProcessingTool)注解处理器,通过给对应的类添加注解,在编译器动态生成对应的路由表文件。这里以分析ARouter的RouteProcessor。在ARouter的使用配置上,需要给base库配置然后给每个组件都配置annot... 查看详情

arouter源码分析

参考技术AAnnotationProcessingTool,自定义注解处理器。搞Android的基本上都知道这个吧。许多第三方库都使用了APT去实现自己的功能,比如butterknife,比如X2C,比如我们要讲的ARouter。其基本做法是:一般是自定义gradleTransform+ASM,实现... 查看详情

arouter原理解析之仿arouter自定义路由框架(代码片段)

ARouter是什么?ARouter是阿里开源的一款android路由框架,帮助AndroidApp进行组件化改造的路由框架——支持模块间的路由、通信、解耦;结合路由可以实现组件化。ARouter接入指北完整Arouter接入指南,ARouter重度用户可... 查看详情

作为androidcoder,你了解注解吗?

...Textname;​​等等,那你有没有自定义过注解,编写过注解处理器呢?本篇就来讲讲...文章总览注解的概念注解(Annotations),是元数 查看详情

路由框架-arouter(跳转拦截)

...ARouter初始化1)首先:在Activity/Fragment类上面写上Routepath注解。   注意:这里的路径需要注意的是至少需要有两级,/xx/xx2)然后:在Activity/Fragment类里面进入Arouter注入,也就是:ARouter.getInstance().inject(this);3)接着:目... 查看详情

aop之注解处理器apt在android中的finderview实际详解(代码片段)

一前言     android中现今流行的各大框架,比如ButterFly、eventBus、OrmLite、Retrofit等都使用注解,注解是什么呢?注解就是元数据,可以理解为属性、方法、类等的一个说明,具体详解可百度,也可移步我... 查看详情

组件化解耦|浅析arouter路由发现原理与简单实践(代码片段)

...项目概览路由动态注册与生成核心思路与技术要点APT处理注解路由初始化Gradle插件实现目标类查找插入代码实现一个简单的路由发现框架模块组成ZRouter-annotationZRouter-compilerZRouter-api结尾前言2022新年好,回顾过去两年虽然零零... 查看详情

aop之注解处理器apt在android中的finderview实际详解(代码片段)

...     具体可查看注解原理详解。      2、通过注解处理器APT来获取。   这里使用的是方式二。注解器处理是在build编译时执行的二原理    1、定义Method、Field的注解类分别为OnClick、BindView,分别应用于Method和Field  ... 查看详情

javaspringmvc之@requestmapping注解

目录@RequestMapping注解注解标识位置value属性method属性params属性headers属性ant风格路径路径占位符@RequestMapping注解@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系。SpringMVC接收到指定... 查看详情

注解处理器(apt)是什么?(代码片段)

...解,这篇咱们科普一下注解的其中一种用途——注解处理器(APT),文章会手把手的帮助大家学会APT的使用,并使用简单的例子来进行练习。一、定义注解处理器(AnnotationProcessingTool,简称APT)ÿ... 查看详情

arouter拦截器之多module独立运行(代码片段)

本文已首发微信公众号「code小生」,大家可以搜索关注,专注安卓技术分享。本文目录本文说明module独立运行第一步:配置gradle.properties第二步:配置app下的`build.gradle`第三步:配置各独立模块下的`bu... 查看详情

04注解处理器(apt)是什么?——《android打怪升级之旅》(代码片段)

...解,这篇咱们科普一下注解的其中一种用途——注解处理器(APT),文章会手把手的帮助大家学会APT的使用。一、定义注解处理器(AnnotationProcessingTool,简称APT),是JDK提供的工具,用于在编译... 查看详情

@requestparam@requestbody@pathvariable之@requestbody注解的使用(代码片段)

第一部分:handlermethod参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为四类:(主要讲解常用类型)A、处理requeturi部分(这里指uritemplate中variable,不含queryString部分)的注解:  @PathVariable;B、处理requesth... 查看详情

java注解之编译时注解(代码片段)

...vironment)Element实战AbstractProcessor一个抽象类,实现注解处理器必须继承它,下面主要介绍里面的几个常用方法。init(ProcessingEnvironmentprocessingEnv)初始化方法,用于获取一些有用的系统工具类,如Elements,Filer,... 查看详情

java注解之编译时注解(代码片段)

...vironment)Element实战AbstractProcessor一个抽象类,实现注解处理器必须继承它,下面主要介绍里面的几个常用方法。init(ProcessingEnvironmentprocessingEnv)初始化方法,用于获取一些有用的系统工具类,如Elements,Filer,... 查看详情

springboot2从入门到入坟|请求参数处理篇:常用参数注解之@pathvariable

...类,下面我给大家详细说一下。传参类型普通参数与基本注解为了方便获取请求参数的值,我们可以在Controller方法的参数列表位置写上一个普通类型的参数,然后再使用基本注解(例如@Requ 查看详情