反射機(jī)制與原理筆記 聲明
文章均為本人技術(shù)筆記,轉(zhuǎn)載請注明出處https://segmentfault.com/u/yzwall
反射機(jī)制反射:當(dāng)程序無法獲知對象類型時,在運(yùn)行期間動態(tài)獲取類的所有屬性和方法,這種動態(tài)獲取類信息和動態(tài)調(diào)用對象方法的功能稱為反射機(jī)制;
反射機(jī)制實(shí)現(xiàn):Class類與java.lang.reflect類庫一起實(shí)現(xiàn)<反射>機(jī)制,
java.lang.reflect類庫包含F(xiàn)ield/Method/Constructors類。這些類型的對象由JVM在運(yùn)行時出創(chuàng)建,分別用于獲取未知類的域/方法/構(gòu)造器:
通過Class類和java.lang.reflect類包,未知對象的類信息在運(yùn)行時被確定,并且在編譯時無需獲??;
RTTI,runtime type information/運(yùn)行時類型信息,JVM運(yùn)行時負(fù)責(zé)記錄一個對象的屬性;
運(yùn)行期間,Java通過Class對象記錄每個對象的RTTI;每當(dāng)編寫并且編譯一個新類時,就會產(chǎn)生一個對應(yīng)的Class對象(和新類保存在一個同名的.class文件中)
JVM通過類加載器創(chuàng)建類的對象實(shí)例類加載器首先檢查類的Class對象是否加載,未加載的話從類的.class文件中加載;
一旦類的Class對象被載入內(nèi)存,它就被用來創(chuàng)建類的所有對象;
java.lang.reflect類reflect包提供以下類供反射使用,解析目標(biāo)類:
Class類:代表一個目標(biāo)類;
Field類:代表目標(biāo)類的成員變量;
Method類:代表目標(biāo)類的方法。
Constructor類:代表目標(biāo)類的構(gòu)造方法。
Array類:提供了動態(tài)創(chuàng)建數(shù)組,以及訪問數(shù)組的元素的靜態(tài)方法;
反射步驟 獲得目標(biāo)類的java.lang.Class對象 已獲得目標(biāo)類對象實(shí)例// Object類 public final native Class> getClass();
如果已獲得目標(biāo)類對象實(shí)例,通過目標(biāo)類對象實(shí)例.getClass()返回該類Class對象;
已獲得目標(biāo)類名假設(shè)目標(biāo)類名為myClass, 通過Class c = myClass.getClass()獲得該類Class對象;
目標(biāo)類名在編譯器不確定,在運(yùn)行期確定如果目標(biāo)類名在編譯器不確定,在運(yùn)行期可以確定,使用Class.forName(目標(biāo)類名)獲取該類Class對象,要求目標(biāo)類名必須是全限定;
Class.forName(目標(biāo)類名)內(nèi)部通過反射API根據(jù)目標(biāo)類名將類手動加載到內(nèi)存中,稱為類加載器加載方法。加載過程中會把目標(biāo)類的static方法,變量,代碼塊加載到JVM,注意此時尚未創(chuàng)建對象實(shí)例;
Object newInstance():通過調(diào)用默認(rèn)構(gòu)造器創(chuàng)建一個對象實(shí)例,
獲得構(gòu)造器反射機(jī)制只能調(diào)用無參的構(gòu)造器創(chuàng)建對象;
Constructor[] getConstructors():獲得所有public構(gòu)造器;
Constructor[] getDeclaredConstructors():獲得所有訪問權(quán)限的構(gòu)造器
Constructor getConstructor(Class[] params):根據(jù)指定參數(shù)獲得對應(yīng)構(gòu)造器;
Constructor getDeclaredConstructor(Class[] params):根據(jù)指定參數(shù)獲得對應(yīng)構(gòu)造器;
獲得方法Method[] getMethods():獲得所有public方法;
Method[] getDeclaredMethods():獲得所有訪問權(quán)限的方法;
Method getMethod(String name, Class[] params):根據(jù)方法簽名獲取類自身對應(yīng)public方法,或者從基類繼承和接口實(shí)現(xiàn)的對應(yīng)public方法;
Method getDeclaredMethod(String name, Class[] params):根據(jù)方法簽名獲得對應(yīng)的類自身聲明方法,訪問權(quán)限不限;
獲得變量Field[] getFields():獲得類中所有public變量
Field[] getDeclaredFields():獲得類中所有訪問權(quán)限變量
Field getField(String name):根據(jù)變量名得到對應(yīng)的public變量
Field getDeclaredField(String name):根據(jù)變量名獲得對應(yīng)的變量,訪問權(quán)限不限;
反射應(yīng)用廣泛應(yīng)用于對象序列化和JavaBean中;
eclipse等IDE補(bǔ)全機(jī)制:eclipse等IDE在代碼構(gòu)建對象時,通過反射機(jī)制自動把該對象能使用的方法和屬性全部列出來,供用戶選擇;
參考[1] http://blog.csdn.net/jojo52013145/article/details/5801962
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/66983.html
摘要:再附一部分架構(gòu)面試視頻講解本文已被開源項(xiàng)目學(xué)習(xí)筆記總結(jié)移動架構(gòu)視頻大廠面試真題項(xiàng)目實(shí)戰(zhàn)源碼收錄 Java反射(一)Java反射(二)Java反射(三)Java注解Java IO(一)Java IO(二)RandomAccessFileJava NIOJava異常詳解Java抽象類和接口的區(qū)別Java深拷貝和淺拷...
摘要:目錄介紹問題匯總具體問題好消息博客筆記大匯總年月到至今,包括基礎(chǔ)及深入知識點(diǎn),技術(shù)博客,學(xué)習(xí)筆記等等,還包括平時開發(fā)中遇到的匯總,當(dāng)然也在工作之余收集了大量的面試題,長期更新維護(hù)并且修正,持續(xù)完善開源的文件是格式的同時也開源了生活博客,從年 目錄介紹 00.Java問題匯總 01.具體問題 好消息 博客筆記大匯總【16年3月到至今】,包括Java基礎(chǔ)及深入知識點(diǎn),Android技...
摘要:純分享直接上干貨操作系統(tǒng)并發(fā)支持進(jìn)程管理內(nèi)存管理文件系統(tǒng)系統(tǒng)進(jìn)程間通信網(wǎng)絡(luò)通信阻塞隊(duì)列數(shù)組有界隊(duì)列鏈表無界隊(duì)列優(yōu)先級有限無界隊(duì)列延時無界隊(duì)列同步隊(duì)列隊(duì)列內(nèi)存模型線程通信機(jī)制內(nèi)存共享消息傳遞內(nèi)存模型順序一致性指令重排序原則內(nèi)存語義線程 純分享 , 直接上干貨! 操作系統(tǒng)并發(fā)支持 進(jìn)程管理內(nèi)存管...
摘要:從使用到原理學(xué)習(xí)線程池關(guān)于線程池的使用,及原理分析分析角度新穎面向切面編程的基本用法基于注解的實(shí)現(xiàn)在軟件開發(fā)中,分散于應(yīng)用中多出的功能被稱為橫切關(guān)注點(diǎn)如事務(wù)安全緩存等。 Java 程序媛手把手教你設(shè)計(jì)模式中的撩妹神技 -- 上篇 遇一人白首,擇一城終老,是多么美好的人生境界,她和他歷經(jīng)風(fēng)雨慢慢變老,回首走過的點(diǎn)點(diǎn)滴滴,依然清楚的記得當(dāng)初愛情萌芽的模樣…… Java 進(jìn)階面試問題列表 -...
閱讀 1813·2021-11-17 09:33
閱讀 3600·2021-11-16 11:40
閱讀 3114·2019-08-30 11:23
閱讀 1102·2019-08-29 16:36
閱讀 2525·2019-08-29 13:23
閱讀 1819·2019-08-29 12:59
閱讀 1609·2019-08-29 12:42
閱讀 2033·2019-08-28 18:22