EventBus源码解析-查询订阅方法

在EventBus源码解析的注册流程,会涉及到订阅者对象的订阅方法获取;

这篇就来解析下订阅者对象是如何获取订阅方法的;


从下往上看注解4,就可得知在获取完订阅者方法后,会将订阅者对象为key,订阅方法列表为value放入METHOD_CACHE中;

因此注解1第一次查询的时候就为null,根据ignoreGeneratedIndex字段来区分是采用反射机制来获取还是通过索引方式来获取;

先看通过反射机制获取的方式


FindState是EventBus的一个静态内部类,封装了订阅者和所有订阅方法的集合



prepareFindState方法是在缓存对象池中取出1个FindState对象

接着完成订阅者对象和FindState的关联

开启循环查询方法

findUsingReflectionInSingleClass是关键的1个方法



1:先通过反射获取订阅者对象的全部方法

2:循环遍历方法,剔除非public和static的方法

3:获取订阅者方法的参数,该参数也就是我们平常post和接收的事件,当且仅当只有1个参数

4:获取订阅者方法的注解,检查是否可以完成订阅

5:确认可订阅,根据注解的参数创建SubscriberMethod加入列表

6:如果订阅者对象无订阅方法,抛出异常,也就是我们平常使用EventBus时候注册了但是在类中没查询到订阅方法时候报的错

在步骤4中存在1个检查是否可以完成订阅,如何检查呢?接着看


类方法重名检查,父类也可能存在相同的订阅方法;



查询完后,移到父类继续查询,直到findState.clazz 为Null;


最后返回订阅方法集合,并且回收对象下次继续复用;

以上就是通过反射机制来获取订阅方法的机制;

接着看通过索引来获取订阅方法(索引的获取方式涉及到注解处理器的概念,之后找个时间单独学习分享)

你可能感兴趣的:(EventBus源码解析-查询订阅方法)