在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;
最后返回订阅方法集合,并且回收对象下次继续复用;
以上就是通过反射机制来获取订阅方法的机制;
接着看通过索引来获取订阅方法(索引的获取方式涉及到注解处理器的概念,之后找个时间单独学习分享)