国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java反射機(jī)制,動態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用

這篇具有很好參考價(jià)值的文章主要介紹了Java反射機(jī)制,動態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1.反射的基礎(chǔ)知識:
Java的反射機(jī)制是指在程序的運(yùn)行狀態(tài)中,可以構(gòu)造任意一個(gè)類的對象,可以了解任意一個(gè)對象所屬的類,可以了解任意一個(gè)類的成員變量和方法,可以調(diào)用任意一個(gè)對象的屬性和方法。這種動態(tài)獲取程序信息以及動態(tài)調(diào)用對象的功能稱為Java語言的反射機(jī)制。
反射的基本操作:
獲取類對象

獲取一個(gè)類的 Class 對象有多種方法:

1.1.1使用 Class.forName(String className) 方法,需要傳入類的全限定名,會返回該類的 Class 對象。

1.1.2使用類名.class,例如 String.class。

1.1.3使用對象.getClass() 方法,返回對象所屬的類的 Class 對象。
獲取類的屬性

1.2使用 Class 類的 getField(String name) 方法可以獲取類的指定公有屬性;使用 getDeclaredField(String name) 方法可以獲取類的指定屬性(無論是否公有)。

1.3獲取類的方法

使用 Class 類的 getMethod(String name, Class… parameterTypes) 方法可以獲取類的指定公有方法;使用 getDeclaredMethod(String name, Class… parameterTypes) 方法可以獲取類的指定方法(無論是否公有)。

1.4獲取類的構(gòu)造函數(shù)

使用 Class 類的 getConstructor(Class… parameterTypes) 方法可以獲取類的指定公有構(gòu)造函數(shù);使用 getDeclaredConstructor(Class… parameterTypes) 方法可以獲取類的指定構(gòu)造函數(shù)(無論是否公有)。

1.5動態(tài)調(diào)用方法

通過反射可以動態(tài)調(diào)用類的方法,例如:

Class clazz = Class.forName(“com.example.MyClass”);
Object obj = clazz.newInstance();
Method method = clazz.getMethod(“myMethod”, String.class);
method.invoke(obj, “parameter”);
上述代碼中,我們先獲取 MyClass 的 Class 對象,然后創(chuàng)建 MyClass 的一個(gè)實(shí)例,接著獲取 myMethod 方法的 Method 對象,最后使用 invoke 方法調(diào)用 myMethod 方法并傳入?yún)?shù)。
2.Retrofit源碼
Java反射機(jī)制,動態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用,java,源碼解析,Android 基礎(chǔ)知識整理,java,retrofit,反射,動態(tài)代理,hook
講上圖之前你要本身會使用Retrofit,我們知道Retrofit 的接口是統(tǒng)一集成在一個(gè)接口文件中的,所以上圖中的service參數(shù)就是
類似下圖的接口類
Java反射機(jī)制,動態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用,java,源碼解析,Android 基礎(chǔ)知識整理,java,retrofit,反射,動態(tài)代理,hook
動態(tài)代理主要就是利用Proxy.newProxyInstance方法生成代理類,其必須實(shí)現(xiàn)InvocationHandler invoke方法,邏輯是如果接口中的方法,記住是所有方法,這也是和使用接口繼承去實(shí)現(xiàn)的區(qū)別,接口中定義的方法統(tǒng)一操作,是動態(tài)代理 接口類的一大特征,如果方法是object的方法就直接invoke傳入當(dāng)前對象和參數(shù),如果不是接著往下走,判斷當(dāng)前平臺是java,android,還是linux的,如果是系統(tǒng)默認(rèn)的方法就invoke系統(tǒng)默認(rèn)的方法,否則用loadServiceMethod來invoke,然后我們看一下下圖的loadServiceMethod方法,最后調(diào)用了ServiceMethod.parseAnnotations
Java反射機(jī)制,動態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用,java,源碼解析,Android 基礎(chǔ)知識整理,java,retrofit,反射,動態(tài)代理,hook
然后是HttpServiceMethod.parseAnnotations
Java反射機(jī)制,動態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用,java,源碼解析,Android 基礎(chǔ)知識整理,java,retrofit,反射,動態(tài)代理,hook
Java反射機(jī)制,動態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用,java,源碼解析,Android 基礎(chǔ)知識整理,java,retrofit,反射,動態(tài)代理,hook
Java反射機(jī)制,動態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用,java,源碼解析,Android 基礎(chǔ)知識整理,java,retrofit,反射,動態(tài)代理,hook
經(jīng)過上圖的幾次跳轉(zhuǎn)后,下圖紅色箭頭的就是最后的CallAdapter接口承接的對象即來自于 callAdapterFactories
Java反射機(jī)制,動態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用,java,源碼解析,Android 基礎(chǔ)知識整理,java,retrofit,反射,動態(tài)代理,hook
由下圖我們找到了是platform.createDefaultCallAdapterFactories產(chǎn)生的
Java反射機(jī)制,動態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用,java,源碼解析,Android 基礎(chǔ)知識整理,java,retrofit,反射,動態(tài)代理,hook
那我們平臺是android 就是android24了,CompletableFutureCallAdapterFactory
和 DefaultCallAdapterFactory
Java反射機(jī)制,動態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用,java,源碼解析,Android 基礎(chǔ)知識整理,java,retrofit,反射,動態(tài)代理,hook
然后就是代理的實(shí)質(zhì)代碼了call.enqueue
Java反射機(jī)制,動態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用,java,源碼解析,Android 基礎(chǔ)知識整理,java,retrofit,反射,動態(tài)代理,hook
最后會在build里面execute,完成整個(gè)流程,代理執(zhí)行完畢。
Java反射機(jī)制,動態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用,java,源碼解析,Android 基礎(chǔ)知識整理,java,retrofit,反射,動態(tài)代理,hook
提一句,從下圖可以看出來Proxy.newProxyInstance動態(tài)代理里面的實(shí)現(xiàn)用到了反射。
Java反射機(jī)制,動態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用,java,源碼解析,Android 基礎(chǔ)知識整理,java,retrofit,反射,動態(tài)代理,hook
3.關(guān)于Hook的我做了一個(gè)demo,英文翻譯過來是鉤子,用一個(gè)成語表達(dá)就是偷梁換柱。用kotlin實(shí)現(xiàn)的,比起java會有點(diǎn)不一樣的:
看下圖,先說要干什么,hook 一下 view的setOnClicklistener的View.OnclickListener。那怎么做呢,因?yàn)镺nclickListener是接口,可以用動態(tài)代理生成,比繼承重寫接口方便一些??赡苣氵€會有疑問那我直接用一個(gè)View.OnclickListener繼承類來set進(jìn)行不就行了,我要說的是這個(gè)測試用例只是為了方便描述,這是這個(gè)接口有set ,對外是開放的,你可以按你想的那樣弄,假如它是不對外開放的呢,hook是不是就有意義了,好了,開始做吧。

Java反射機(jī)制,動態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用,java,源碼解析,Android 基礎(chǔ)知識整理,java,retrofit,反射,動態(tài)代理,hook
首先我們先看一下view.setOnClickListener方法里面的情況。下圖中我們要hook的對象被getListenerInfo()所持有,
Java反射機(jī)制,動態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用,java,源碼解析,Android 基礎(chǔ)知識整理,java,retrofit,反射,動態(tài)代理,hook
那就看看getListenerInfo()返回的對象是
Java反射機(jī)制,動態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用,java,源碼解析,Android 基礎(chǔ)知識整理,java,retrofit,反射,動態(tài)代理,hook
是view的一個(gè)屬性mListenerInfo
Java反射機(jī)制,動態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用,java,源碼解析,Android 基礎(chǔ)知識整理,java,retrofit,反射,動態(tài)代理,hook
ListenerInfo是View的一個(gè)靜態(tài)內(nèi)部類,而它的屬性mOnClickListener正是我們要找的hook對象了。
Java反射機(jī)制,動態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用,java,源碼解析,Android 基礎(chǔ)知識整理,java,retrofit,反射,動態(tài)代理,hook
那思路就是利用反射來拿到mListenerInfo對象,拿到它的屬性mOnClickListener并替換成 我們動態(tài)代理生成的接口。需要注意的是args,kotlin是需要加的。查了查好像說是數(shù)組展開,沒理解,知道的可以評論區(qū)評論。

Java反射機(jī)制,動態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用,java,源碼解析,Android 基礎(chǔ)知識整理,java,retrofit,反射,動態(tài)代理,hook
然后我們回過頭來看反射機(jī)制是 基礎(chǔ),動態(tài)代理里面也是用反射來實(shí)現(xiàn)的,動態(tài)代理對類里面的所有方法統(tǒng)一動態(tài)加入操作代碼,java使用更多是對接口的,是生成了你想往里面塞的代碼,hook把hook對象勾出來,換成自己想塞進(jìn)去的,是一種手法。文章來源地址http://www.zghlxwxcb.cn/news/detail-647562.html

到了這里,關(guān)于Java反射機(jī)制,動態(tài)代理,hook以及在Retrofit源碼中的應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【JAVA】單元測試、反射、注解、動態(tài)代理

    @Test 測試方法 @Before 用來修飾實(shí)例方法,該方法會在每一個(gè)測試方法執(zhí)行之前執(zhí)行一次。 @After 用來修飾實(shí)例方法,該方法會在每一個(gè)測試方法執(zhí)行之后執(zhí)行一次。 @Before Class 用來靜態(tài)修飾方法,該方法會在所有測試方法之前只執(zhí)行一次。 @After Class 用來靜態(tài)修飾方法,該方法

    2024年02月11日
    瀏覽(20)
  • 反射機(jī)制-體會反射的動態(tài)性案例(尚硅谷Java學(xué)習(xí)筆記)

    反射機(jī)制-體會反射的動態(tài)性案例(尚硅谷Java學(xué)習(xí)筆記)

    // 舉例01 public class Reflect{ } 案例:榨汁機(jī)榨水果汁,水果分別有果(com.reflect.Apple)、香蕉(Banana)、桔子(Orange)等。 效果如圖。 提示: 1、聲明(Fruit)水果接口,包含榨汁抽象方法: void squeeze(); /skwi:z/ 2、聲明榨汁機(jī)(Juicer),包含運(yùn)行方法: public void run(Fruit f),方法體中,調(diào)用f的榨汁方

    2024年02月11日
    瀏覽(30)
  • Day20-【Java SE高級】單元測試 反射 注解 動態(tài)代理

    Day20-【Java SE高級】單元測試 反射 注解 動態(tài)代理

    就是針對最小的功能單元(方法),編寫測試代碼對其進(jìn)行正確性測試。 1. 咱們之前是如何進(jìn)行單元測試的?有啥問題? 只能在main方法編寫測試代碼,去調(diào)用其他方法進(jìn)行測試。 無法實(shí)現(xiàn)自動化測試,一個(gè)方法測試失敗,可能影響其他方法的測試。 無法得到測試的報(bào)告,需要程

    2024年04月17日
    瀏覽(22)
  • java中的靜態(tài)代理、jdk動態(tài)代理以及CGLIB 動態(tài)代理

    代理模式是一種比較好理解的設(shè)計(jì)模式。簡單來說就是 我們使用代理對象來代替對真實(shí)對象(real object)的訪問,這樣就可以在不修改原目標(biāo)對象的前提下,提供額外的功能操作,擴(kuò)展目標(biāo)對象的功能 那以下文章主要談三種代理模式, 分別是靜態(tài)代理,jdk的動態(tài)代理,cglib的動

    2024年02月11日
    瀏覽(26)
  • 【C#】反射機(jī)制,動態(tài)加載類文件

    【C#】反射機(jī)制,動態(tài)加載類文件

    【C#】編號生成器(定義單號規(guī)則、固定字符、流水號、業(yè)務(wù)單號) 本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范圍生成器(開始日期、結(jié)束日期) 本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/129040663 【C#】組件化開發(fā),調(diào)用dll組件方法 本文鏈接

    2024年02月11日
    瀏覽(16)
  • 深入源碼解析ArrayList:探秘Java動態(tài)數(shù)組的機(jī)制與性能

    深入源碼解析ArrayList:探秘Java動態(tài)數(shù)組的機(jī)制與性能

    1.1 介紹ArrayList的基本概念和作用 在Java中,ArrayList是一個(gè)實(shí)現(xiàn)了List接口的動態(tài)數(shù)組。它可以根據(jù)需要自動增加大小,因此可以存儲任意數(shù)量的元素。 基本概念: ArrayList是Java中常用的集合類之一,它可以存儲對象,并且可以根據(jù)索引訪問和操作這些對象。 ArrayList是基于數(shù)組

    2024年02月04日
    瀏覽(32)
  • Java筆記040-反射/反射機(jī)制、Class類

    Java筆記040-反射/反射機(jī)制、Class類

    目錄 反射(reflection) 一個(gè)需求引出反射 反射機(jī)制 Java反射機(jī)制原理圖 Java反射機(jī)制可以完成 反射相關(guān)的主要類 反射機(jī)制的優(yōu)點(diǎn)和缺點(diǎn) 反射調(diào)用優(yōu)化-關(guān)閉訪問檢查 Class類 基本介紹 代碼解釋部分 類加載方法 應(yīng)用實(shí)例:Class02.java 獲取Class類對象 代碼解釋部分 哪些類型有Class對象

    2024年02月09日
    瀏覽(20)
  • C# 通過反射以及動態(tài)調(diào)用方法

    C# 通過反射以及動態(tài)調(diào)用方法

    有時(shí)候需要通過反射以及動態(tài)調(diào)用的辦法去調(diào)用已知的實(shí)例的方法,感覺還是挺巧妙的。以下主要記錄通過反射以及動態(tài)的調(diào)用方法。 運(yùn)行結(jié)果如下圖所示: 總結(jié):在已知方法的情況下,還是動態(tài)調(diào)用比較方便,但是要注意異常處理,畢竟這屬于特殊情況,編譯執(zhí)行前不會

    2024年02月07日
    瀏覽(26)
  • 【Java基礎(chǔ)】深入理解反射、反射的應(yīng)用(工廠模式、代理模式)

    【Java基礎(chǔ)】深入理解反射、反射的應(yīng)用(工廠模式、代理模式)

    Java 反射機(jī)制是指在 運(yùn)行時(shí)動態(tài)地獲取和操作類的信息、調(diào)用對象的方法和訪問對象的屬性的能力 。通過反射,可以在程序運(yùn)行時(shí)分析和修改類的結(jié)構(gòu)、行為和狀態(tài)。 Java 反射機(jī)制提供了以下功能: 獲取類的信息:可以獲取類的名稱、修飾符、父類、實(shí)現(xiàn)的接口等。 創(chuàng)建對

    2024年02月09日
    瀏覽(23)
  • Java的反射機(jī)制

    Java 的反射機(jī)制允許在程序運(yùn)行期間,借助反射 API 獲取類的內(nèi)部信息,并能直接操作對象的內(nèi)部屬性及方法。 Java 反射機(jī)制提供的功能: 在運(yùn)行時(shí),使用反射分析類的能力,獲取有關(guān)類的一切信息(類所在的包、類實(shí)現(xiàn)的接口、標(biāo)注的注解、類的數(shù)據(jù)域、類的構(gòu)造器、類的

    2024年02月02日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包