组件化学习(3)ARouter中的Path和Group注解

这里就不对ARouter进行全面分析了,而是把Group和Path的思想抽象出来理解

1.介绍下Group和Path

在上一篇文章中也提到过,Group就是组,Path就是组里面具体的类。在ARouter的api模块中,有针对GroupPath的接口ARouterGroupARouterPath。如下(这里只是举个例子,并不一定真有同名接口,但是思想是一样的)

public interface ARouterGroup {
    Map<String, Class<? extends ARouterPath>> getGroupMap();
}
  • ARouterGroup接口:
    有一个Map集合,key,就是各个组名,比如appcommon等等。value就是每个组名对应的详情类。其实就是实现了ARouterPath接口的类.
  • ARouterPath接口:
public interface ARouterPath {
    Map<String, RouterBean> getPathMap();
}

这里的key就是Pathvalue就是与Path相对应的,被RouterBean封装了的class对象。比如key/app/MainActivityvalue就是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组里面所有的Pathvalue就是与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代码,我还没有进行详细学习,等后面用到的时候再学习吧,现在先掌握思想。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>