首頁 要聞 中國 經(jīng)濟(jì) 財(cái)經(jīng) 品牌 點(diǎn)評 會展 綜合 | 設(shè)為首頁
中國品牌要聞網(wǎng)-傳遞資訊的價(jià)值打造品牌的影響
您現(xiàn)在的位置:首頁/奢侈品/ 正文
method.invoke在框架中經(jīng)常用到method.invoke()方法
來源:
編輯:
時(shí)間:2022-10-18

 在框架中經(jīng)常會會用到method.invoke()方法,用來執(zhí)行某個(gè)的對象的目標(biāo)方法。以前寫代碼用到反射時(shí),總是獲取先獲取Method,然后傳入對應(yīng)的Class實(shí)例對象執(zhí)行方法。然而前段時(shí)間研究invoke方法時(shí),發(fā)現(xiàn)invoke方法居然包含多態(tài)的特性,這是以前沒有考慮過的一個(gè)問題。那么Method.invoke()方法的執(zhí)行過程是怎么實(shí)現(xiàn)的?它的多態(tài)又是如何實(shí)現(xiàn)的呢?

1.先檢查 AccessibleObject的override屬性是否為true。AccessibleObject是Method,Field,Constructor的父類,override屬性默認(rèn)為false,可調(diào)用setAccessible方法改變,如果設(shè)置為true,則表示可以忽略訪問權(quán)限的限制,直接調(diào)用。

2.如果不是ture,則要進(jìn)行訪問權(quán)限檢測。用Reflection的quickCheckMemberAccess方法先檢查是不是public的,如果不是再用Reflection.getCallerClass(1)方法獲得到調(diào)用這個(gè)方法的Class,然后做是否有權(quán)限訪問的校驗(yàn),校驗(yàn)之后緩存一次,以便下次如果還是這個(gè)類來調(diào)用就不用去做校驗(yàn)了,直接用上次的結(jié)果,(很奇怪用這種方式緩存,因?yàn)檫@種方式如果下次換個(gè)類來調(diào)用的話,就不用會緩存了,而再驗(yàn)證一遍,把這次的結(jié)果做為緩存,但上一次的緩存結(jié)果就被沖掉了。這是一個(gè)很簡單的緩沖機(jī)制,只適用于一個(gè)類的重復(fù)調(diào)用)。

3.調(diào)用MethodAccessor的invoke方法。每個(gè)Method對象包含一個(gè)root對象,root對象里持有一個(gè)MethodAccessor對象。我們獲得的Method獨(dú)享相當(dāng)于一個(gè)root對象的鏡像,所有這類Method共享root里的MethodAccessor對象,(這個(gè)對象由ReflectionFactory方法生成,ReflectionFactory對象在Method類中是static final的由native方法實(shí)例化)。

ReflectionFactory生成MethodAccessor:如果noInflation的屬性為true則直接返回MethodAccessorGenerator創(chuàng)建的一個(gè)MethodAccessor。否則返回DelegatingMethodAccessorImpl,并將他與一個(gè)NativeMethodAccessorImpl互相引用。但DelegatingMethodAccessorImpl執(zhí)行invoke方法的時(shí)候又委托給NativeMethodAccessorImpl了。

Method的invoke()方法的使用:

對帶有指定參數(shù)的指定對象調(diào)用由此 Method 對象表示的底層方法。個(gè)別參數(shù)被自動解包,以便與基本形參相匹配,基本參數(shù)和引用參數(shù)都隨需服從方法調(diào)用轉(zhuǎn)換。

如果底層方法是靜態(tài)的,那么可以忽略指定的 obj 參數(shù)。該參數(shù)可以為 null。

如果底層方法所需的形參數(shù)為 0,則所提供的 args 數(shù)組長度可以為 0 或 null。

如果底層方法是靜態(tài)的,并且尚未初始化聲明此方法的類,則會將其初始化。

如果方法正常完成,則將該方法返回的值返回給調(diào)用者;如果該值為基本類型,則首先適當(dāng)?shù)貙⑵浒b在對象中。但是,如果該值的類型為一組基本類型,則數(shù)組元素不 被包裝在對象中;換句話說,將返回基本類型的數(shù)組。如果底層方法返回類型為 void,則該調(diào)用返回 null。

免責(zé)聲明:本文僅代表作者個(gè)人觀點(diǎn),與本網(wǎng)無關(guān)。其原創(chuàng)性以及文中陳述文字和內(nèi)容未經(jīng)本站證實(shí), 對本文以及其中全部或者部分內(nèi)容、文字的真實(shí)性、完整性、及時(shí)性本站不作任何保證或承諾, 請讀者僅作參考,并請自行核實(shí)相關(guān)內(nèi)容。當(dāng)事人(單位)如有異議,請參閱《刪帖說明》辦理。
中國品牌要聞網(wǎng)-傳遞資訊的價(jià)值打造品牌的影響
編輯:綜合整理
2024-06-03
評論(0)
編輯:綜合整理
2024-05-29
評論(0)
  • CopyRight@ 2005-2022 中國品牌要聞網(wǎng)
  • 工商注冊號 430122000189097
  • ICP備案許證:渝ICP備2022012785號