一、這是創建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的構建和創建工作。