在EventBus源碼解析的注冊流程舀奶,會(huì)涉及到訂閱者對象的訂閱方法獲取斋射;
這篇就來解析下訂閱者對象是如何獲取訂閱方法的育勺;
從下往上看注解4,就可得知在獲取完訂閱者方法后罗岖,會(huì)將訂閱者對象為key涧至,訂閱方法列表為value放入METHOD_CACHE中;
因此注解1第一次查詢的時(shí)候就為null呀闻,根據(jù)ignoreGeneratedIndex字段來區(qū)分是采用反射機(jī)制來獲取還是通過索引方式來獲然琛;
先看通過反射機(jī)制獲取的方式
FindState是EventBus的一個(gè)靜態(tài)內(nèi)部類捡多,封裝了訂閱者和所有訂閱方法的集合
prepareFindState方法是在緩存對象池中取出1個(gè)FindState對象
接著完成訂閱者對象和FindState的關(guān)聯(lián)
開啟循環(huán)查詢方法
findUsingReflectionInSingleClass是關(guān)鍵的1個(gè)方法
1:先通過反射獲取訂閱者對象的全部方法
2:循環(huán)遍歷方法蓖康,剔除非public和static的方法
3:獲取訂閱者方法的參數(shù),該參數(shù)也就是我們平常post和接收的事件垒手,當(dāng)且僅當(dāng)只有1個(gè)參數(shù)
4:獲取訂閱者方法的注解蒜焊,檢查是否可以完成訂閱
5:確認(rèn)可訂閱,根據(jù)注解的參數(shù)創(chuàng)建SubscriberMethod加入列表
6:如果訂閱者對象無訂閱方法科贬,拋出異常泳梆,也就是我們平常使用EventBus時(shí)候注冊了但是在類中沒查詢到訂閱方法時(shí)候報(bào)的錯(cuò)
在步驟4中存在1個(gè)檢查是否可以完成訂閱,如何檢查呢榜掌?接著看
類方法重名檢查优妙,父類也可能存在相同的訂閱方法;
查詢完后憎账,移到父類繼續(xù)查詢套硼,直到findState.clazz 為Null;
最后返回訂閱方法集合,并且回收對象下次繼續(xù)復(fù)用胞皱;
以上就是通過反射機(jī)制來獲取訂閱方法的機(jī)制邪意;
接著看通過索引來獲取訂閱方法(索引的獲取方式涉及到注解處理器的概念,之后找個(gè)時(shí)間單獨(dú)學(xué)習(xí)分享)