retrofit源碼分析

一、這是創建Retrofit這個類,然後去加載IService接口文件

二、在Create方法中,加載IService的時候使用了動態代理,用來對方法進行包裝

 

針對if (method.getDeclaringClass() == Object.class) {

  return method.invoke(this, args);

}

然而動態代理對象裏面的方法都是Interface規定的。但是動態代理對象也能調用比如toString(),hashCode()等這些方法呀,這些方法是所有類從Object繼承過來的。

所以這個判斷的根本作用就是,如果利用動態代理對象調用的是toString,hashCode,getClass等這些從Object類繼承過來的方法,就直接反射調用。如果調用的是接口規定的方法。我們就用MapperMethod來執行。

 

結論:

1)、method.getDeclaringClass用來判斷當前這個方法是哪個類的方法。

2)、接口創建出的代理對象不僅有實現接口的方法,也有從Object繼承過來的方法

3)、實現的接口的方法method.getDeclaringClass是接口類型,比如com.atguigu.dao.EmpDao

        從Object類繼承過來的方法類型是java.lang.Object類型

4)、如果是Object類繼承來的方法,直接反射調用

        如果是實現的接口規定的方法,利用Mybatis的MapperMethod調用

 

三、關於ServiceMethod方法,這個方法是對傳入的service方法具體解析,相當於一個bean,保存代理對象的類型等,在這一步一個ServiceMethod方法對應一個IService中的方法,加入到了一個ConcurrentHashMap中

首先會調用ServiceMethod的Builder方法,在這個方法中,獲取了代理方法的所有泛型,參數泛型,以及參數泛型類型。

在Builder之後就開始了Build方法,這個方法比較長,我們一段一段的看。

四、ServuceMethod方法的Build方法

4.1創建了一個CallAdapter適配器和一個ResponseConverter轉換器,並且對方法註解進行解析。

4.2 增加了一些錯誤判斷,並進行拋出異常

4.3通過parseParameter對註解參數進行解析

 

五、在3.1方法中我們看到會調用parseMethodAnnotation方法,這個方法,提供了具體的解析某一種類型。並對這些類型進行了判斷,

六、然後我們去看parseHttpMethodAndPath方法,用來得到註解的值

七、在3.3方法中還要對註解參數的解析,這個解析比解析代理方法的註解內容要多,判斷也要多,摘錄了一個Query分析一下,

到此Build構造完成。

八、經過三到七的操作,完成對代理類的解析,此時我們再來看二的內容,在OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args);return serviceMethod.adapt(okHttpCall);的最後一句,其中serviceMethod.adapt(okHttpCall),這個方法會去調用ServiceMethod方法的adapt方法

從圖中可以看出,要用到了callAdapter這個適配器

九、callAdapter的創建,此時又回到了Retrofit類的callAdapter

十、從callAdapterFactories中得到想要的callAdapter,在這裏callAdater就是我們的第一步中的RxJava2CallAdapterFactory,會去調用RxJava2CallAdapterFactory的 adapter方法去適配,從而開始了RxJava的調用

 

到此,完成了對Retrofit的構建和創建工作。

參考:http://blog.csdn.net/maplejaw_/article/details/51942145

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章