-
Retrofit是如何解析注解以及裝配參數(shù)的呢?
serviceMethodCached是線程安全的。它用于緩存我們創(chuàng)建的ServiceMethod實例,由于我們需要頻繁的去請求定義的接口中的方法,當有ServiceMethod實例的緩存時,就不需要頻繁創(chuàng)建了。
下圖的Builder將
上圖中的paresHttpMethodAndPath方法的注解進行解析,是否有HttpMethod:即Get或者POST。是否有body,是否有@Query注解的參數(shù),請求路徑中是否有參數(shù)等等,有就會進行解析。下圖的parseParameter方法便開始對請求方法中的參數(shù)進行解析。
查看全部 -
Retrofit通過我們調(diào)用create方法時傳遞的接口,通過Java內(nèi)置的動態(tài)代理對象Proxy的newProxyInstance方法,為我們動態(tài)生成Proxy代理類實例,該實例是Proxy類型實例,Java的動態(tài)代理只能為接口創(chuàng)建代理類,不能為抽象類或其他類生成代理類,否則會報錯。
Java8中interface也能定義deafault方法。
Retrofit.create()就是通過Java的動態(tài)代理將我們自定義實現(xiàn)的請求Interface的方法先轉(zhuǎn)給了InvocationHandler的invoke(),再轉(zhuǎn)嫁給loadServiceMethod實例的invoke(),該invoke方法生成了一個okhttpCall實例。
查看全部 -
Gson對象實例化流程
查看全部 -
動態(tài)代理JDK原生實現(xiàn)與cglib實現(xiàn)的對比
查看全部 -
記一個能記筆記的筆記哦
查看全部 -
查看全部
-
學(xué)習(xí)到了很多:
1. 閱讀源碼的方式
① 站在使用者的角度,從使用到的代碼,一步步深入,直到具體的實現(xiàn),如Retrofit.create(),返回得到接口的實體是動態(tài)代理得到的;如IApiService的每個方法調(diào)用,返回得到Call/Observable,通過解析方法上的注解,得到HttpServiceMethod$CallAdapted,將OkHttpCall轉(zhuǎn)換得到相應(yīng)的類型,如Call,調(diào)用Call.execute(),內(nèi)部調(diào)用OkHttpCall.execute(),通過OkHttpClient執(zhí)行真正的網(wǎng)絡(luò)請求;又如CallAdapter是如何將Call轉(zhuǎn)換成需要的類型的。
② 再找一些我們熟悉的知識點進一步了解原理,如解析注解的過程,如OkHttpCall的內(nèi)部實現(xiàn)方式,如反序列化的實現(xiàn)。
③ 總結(jié)其中使用到的設(shè)計模式,查看已經(jīng)熟悉的設(shè)計模式,進一步了解原理,查看不熟悉的設(shè)計模式,了解庫的實現(xiàn)者是如何利用這種設(shè)計模式的。總的來說,還是以我們熟悉的方式去查看源碼。
④ 根據(jù)需求,可以總結(jié)庫的優(yōu)劣勢,需要學(xué)習(xí)到的點,可能會在日常開發(fā)中使用到的點,甚至是對庫的建議。
2. 某些知識點的了解
① 注解的使用場景。在Retrofit中,注解主要用于業(yè)務(wù)邏輯的處理。另外還有在Room/Dagger中,注解用于在編譯期生成代碼,在編譯器生成字節(jié)碼。
② kotlin的原理,編譯時修改函數(shù)簽名,在函數(shù)中參數(shù)列表末尾添加一個Continutation參數(shù)(實際上是一個回調(diào)接口)。
③ Gson的實現(xiàn)原理。使用構(gòu)造器/Unsafe,創(chuàng)建實體或分配實體需要的內(nèi)存空間,讀取json數(shù)據(jù),解析類上的注解。
④ 反射、泛型的淺層了解。
另外還有未完全掌握的知識點:
泛型的深入理解,如wildcard,類型擦除所帶來的問題與解決方案,特別是運行時。理解signature
Unsafe的使用與原理
反射的深入了解
查看全部 -
guf查看全部
-
用反射的方式修改反射本身
查看全部 -
類中聲明一個屬性:private?static?final?int?a =1,這個?a?可以通過反射修改嗎?
不能,運行時會拋出 IllegalAccessException?異常
查看全部 -
對象中聲明一個屬性:private?final?int?a =1,這個?a?可以通過反射修改嗎?
不能,源碼編譯時會將?a?編譯為一個編譯期常量,把這個字段被使用的地方都替換為直接的字面量
查看全部 -
如何動態(tài)修改?Retrofit?的?BaseUrl?
*?持有?HttpUrl?的引用
*?通過反射修改?HttpUrl?中的?Schema、Host、Port?等內(nèi)部字段的值
查看全部 -
自定義一下maven倉庫
查看全部 -
0.0啊呀呀
查看全部 -
代理的其他實現(xiàn)方案:Cglib
eg. Spring中使用的就是Cglib
查看全部 -
接口的實現(xiàn)類是從哪里來的?
create方法中通過java內(nèi)置的動態(tài)代理實現(xiàn)的。將接口中的所有方法轉(zhuǎn)給了InvocationHandler的invoke方法,并返回一個loadServiceMethod(是一個ServiceMethod)方法。由它發(fā)起網(wǎng)絡(luò)請求。
查看全部 -
Gson反序列化過程
查看全部 -
了解Retrofit的內(nèi)部實現(xiàn)原理
查看全部 -
5-4 代理模式
查看全部 -
適配器模式
查看全部 -
Builder模式
查看全部 -
抽象工廠模式
查看全部 -
Gson對象實例化流程
查看全部 -
靜態(tài)代理3
查看全部 -
動態(tài)代理JDK原生實現(xiàn)與cglib實現(xiàn)的對比
查看全部
舉報