组件化学习(3)ARouter中的Path和Group注解
这里就不对ARouter进行全面分析了,而是把Group和Path的思想抽象出来理解
1.介绍下Group和Path
在上一篇文章中也提到过,Group就是组,Path就是组里面具体的类。在ARouter的api模块中,有针对Group和Path的接口ARouterGroup和ARouterPath。如下(这里只是举个例子,并不一定真有同名接口,但是思想是一样的)
public interface ARouterGroup {
Map<String, Class<? extends ARouterPath>> getGroupMap();
}
-
ARouterGroup接口:
有一个Map集合,key,就是各个组名,比如app,common等等。value就是每个组名对应的详情类。其实就是实现了ARouterPath接口的类. -
ARouterPath接口:
public interface ARouterPath {
Map<String, RouterBean> getPathMap();
}
这里的key就是Path,value就是与Path相对应的,被RouterBean封装了的class对象。比如key是/app/MainActivity,value就是RouterBean<MainActivity.class>
RouterBean就是这样的,其中被框起来的就是Class对象。可以理解成对Class对象的封装
2.Path和Group的工作原理
注意: 先有Path的接口ARouterPath,再有Group的接口ARouterGroup,因为Group要遍历使用Path
说到这里,可能还是对ARouterGroup接口,ARouterPath接口不太熟悉。我在这里把具体实现的效果拿过来,就好理解多了
在具体实现的时候,即利用JavaPoet生成类文件的时候
①要首先生成,实现了ARouterPath接口的类。不同的group有不同的实现类。比如app组就对应一个ARouterPath的实现类,里面也有一个Map集合,key可以是app组里面所有的Path,value就是与Path对应的RouterBean。
②然后生成实现了ARouterGroup接口的类。这个类也是一个组对应一个,相当于一个模块对应一个路由表。key就是不同的组,value就是不同的组对应的ARouterPath的实现类。
假如目前只有两个业务模块,即order和personal,则
①生成的实现ARouterPath接口的类的具体代码实现如图所示
order模块生成的,里面的Map集合存储了order模块所有的path
personal模块生成的
②生成的实现ARouterGroup接口的类的具体代码实现如图所示
order板块生成的,里面存储了所有可能用到的模块对应的实现了ARouterPath的Class对象personal板块生成的
需要通信的时候,比如order模块要向personal模块通信,我认为就需要找order模块生成的ARouter$$Group$$order,查找里面的路由表从而得到目标类所属的ARouter$$Path$$personal.class,然后利用ARouter$$Path$$personal.class里面的Map集合,找到目标类的 RouterBean对象,即得到了目标类的class对象
代码描述就是这样:
ARouter$$Group$$order.getGroupMap().get("personal").get("targetClass")
ARouter的参数传递,也是类似的思想,和ButterKnife也很像。就是在需要传递的参数定义上面加上注解,然后编译的时候生成特定的类的类文件,这个类文件的作用就是可以使用Bundle,给对应的类的这些参数赋值
我所理解的Path和Group原理就是这样。具体的生成这些类文件的JavaPoet代码,我还没有进行详细学习,等后面用到的时候再学习吧,现在先掌握思想。



