成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

反射機(jī)制與原理筆記

fobnn / 2525人閱讀

反射機(jī)制與原理筆記 聲明

文章均為本人技術(shù)筆記,轉(zhuǎn)載請(qǐng)注明出處https://segmentfault.com/u/yzwall

反射機(jī)制

反射:當(dāng)程序無法獲知對(duì)象類型時(shí),在運(yùn)行期間動(dòng)態(tài)獲取類的所有屬性和方法,這種動(dòng)態(tài)獲取類信息和動(dòng)態(tài)調(diào)用對(duì)象方法的功能稱為反射機(jī)制;
反射機(jī)制實(shí)現(xiàn):Class類與java.lang.reflect類庫一起實(shí)現(xiàn)<反射>機(jī)制,
java.lang.reflect類庫包含F(xiàn)ield/Method/Constructors類。這些類型的對(duì)象由JVM在運(yùn)行時(shí)出創(chuàng)建,分別用于獲取未知類的域/方法/構(gòu)造器:
通過Class類和java.lang.reflect類包,未知對(duì)象的類信息在運(yùn)行時(shí)被確定,并且在編譯時(shí)無需獲取;

RTTI與java.lang.Class類

RTTI,runtime type information/運(yùn)行時(shí)類型信息,JVM運(yùn)行時(shí)負(fù)責(zé)記錄一個(gè)對(duì)象的屬性;

運(yùn)行期間,Java通過Class對(duì)象記錄每個(gè)對(duì)象的RTTI;每當(dāng)編寫并且編譯一個(gè)新類時(shí),就會(huì)產(chǎn)生一個(gè)對(duì)應(yīng)的Class對(duì)象(和新類保存在一個(gè)同名的.class文件中)

JVM通過類加載器創(chuàng)建類的對(duì)象實(shí)例

類加載器首先檢查類的Class對(duì)象是否加載,未加載的話從類的.class文件中加載;

一旦類的Class對(duì)象被載入內(nèi)存,它就被用來創(chuàng)建類的所有對(duì)象;

java.lang.reflect類

reflect包提供以下類供反射使用,解析目標(biāo)類:

Class類:代表一個(gè)目標(biāo)類;

Field類:代表目標(biāo)類的成員變量;

Method類:代表目標(biāo)類的方法。

Constructor類:代表目標(biāo)類的構(gòu)造方法。

Array類:提供了動(dòng)態(tài)創(chuàng)建數(shù)組,以及訪問數(shù)組的元素的靜態(tài)方法;

反射步驟 獲得目標(biāo)類的java.lang.Class對(duì)象 已獲得目標(biāo)類對(duì)象實(shí)例
// Object類
public final native Class getClass();

如果已獲得目標(biāo)類對(duì)象實(shí)例,通過目標(biāo)類對(duì)象實(shí)例.getClass()返回該類Class對(duì)象;

已獲得目標(biāo)類名

假設(shè)目標(biāo)類名為myClass, 通過Class c = myClass.getClass()獲得該類Class對(duì)象;

目標(biāo)類名在編譯器不確定,在運(yùn)行期確定

如果目標(biāo)類名在編譯器不確定,在運(yùn)行期可以確定,使用Class.forName(目標(biāo)類名)獲取該類Class對(duì)象,要求目標(biāo)類名必須是全限定;
Class.forName(目標(biāo)類名)內(nèi)部通過反射API根據(jù)目標(biāo)類名將類手動(dòng)加載到內(nèi)存中,稱為類加載器加載方法。加載過程中會(huì)把目標(biāo)類的static方法,變量,代碼塊加載到JVM,注意此時(shí)尚未創(chuàng)建對(duì)象實(shí)例;

利用java.lang.Class對(duì)象通過反射API獲取目標(biāo)類信息 創(chuàng)建目標(biāo)類對(duì)象實(shí)例

Object newInstance():通過調(diào)用默認(rèn)構(gòu)造器創(chuàng)建一個(gè)對(duì)象實(shí)例,

反射機(jī)制只能調(diào)用無參的構(gòu)造器創(chuàng)建對(duì)象;

獲得構(gòu)造器

Constructor[] getConstructors():獲得所有public構(gòu)造器;

Constructor[] getDeclaredConstructors():獲得所有訪問權(quán)限的構(gòu)造器

Constructor getConstructor(Class[] params):根據(jù)指定參數(shù)獲得對(duì)應(yīng)構(gòu)造器;

Constructor getDeclaredConstructor(Class[] params):根據(jù)指定參數(shù)獲得對(duì)應(yīng)構(gòu)造器;

獲得方法

Method[] getMethods():獲得所有public方法;

Method[] getDeclaredMethods():獲得所有訪問權(quán)限的方法;

Method getMethod(String name, Class[] params):根據(jù)方法簽名獲取類自身對(duì)應(yīng)public方法,或者從基類繼承和接口實(shí)現(xiàn)的對(duì)應(yīng)public方法;

Method getDeclaredMethod(String name, Class[] params):根據(jù)方法簽名獲得對(duì)應(yīng)的類自身聲明方法訪問權(quán)限不限;

獲得變量

Field[] getFields():獲得類中所有public變量

Field[] getDeclaredFields():獲得類中所有訪問權(quán)限變量

Field getField(String name):根據(jù)變量名得到對(duì)應(yīng)的public變量

Field getDeclaredField(String name):根據(jù)變量名獲得對(duì)應(yīng)的變量,訪問權(quán)限不限;

反射應(yīng)用

廣泛應(yīng)用于對(duì)象序列化和JavaBean中;

eclipse等IDE補(bǔ)全機(jī)制:eclipse等IDE在代碼構(gòu)建對(duì)象時(shí),通過反射機(jī)制自動(dòng)把該對(duì)象能使用的方法和屬性全部列出來,供用戶選擇;

參考

[1] http://blog.csdn.net/jojo52013145/article/details/5801962

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66983.html

相關(guān)文章

  • 四年來Android面試大綱,作為一個(gè)Android程序員

    摘要:再附一部分架構(gòu)面試視頻講解本文已被開源項(xiàng)目學(xué)習(xí)筆記總結(jié)移動(dòng)架構(gòu)視頻大廠面試真題項(xiàng)目實(shí)戰(zhàn)源碼收錄 Java反射(一)Java反射(二)Java反射(三)Java注解Java IO(一)Java IO(二)RandomAccessFileJava NIOJava異常詳解Java抽象類和接口的區(qū)別Java深拷貝和淺拷...

    不知名網(wǎng)友 評(píng)論0 收藏0
  • Java問題匯總,持續(xù)更新到GitHub

    摘要:目錄介紹問題匯總具體問題好消息博客筆記大匯總年月到至今,包括基礎(chǔ)及深入知識(shí)點(diǎn),技術(shù)博客,學(xué)習(xí)筆記等等,還包括平時(shí)開發(fā)中遇到的匯總,當(dāng)然也在工作之余收集了大量的面試題,長期更新維護(hù)并且修正,持續(xù)完善開源的文件是格式的同時(shí)也開源了生活博客,從年 目錄介紹 00.Java問題匯總 01.具體問題 好消息 博客筆記大匯總【16年3月到至今】,包括Java基礎(chǔ)及深入知識(shí)點(diǎn),Android技...

    beita 評(píng)論0 收藏0
  • 阿里 2021 版最全 Java 并發(fā)編程筆記,看完我才懂了“內(nèi)卷”的真正意義

    摘要:純分享直接上干貨操作系統(tǒng)并發(fā)支持進(jìn)程管理內(nèi)存管理文件系統(tǒng)系統(tǒng)進(jìn)程間通信網(wǎng)絡(luò)通信阻塞隊(duì)列數(shù)組有界隊(duì)列鏈表無界隊(duì)列優(yōu)先級(jí)有限無界隊(duì)列延時(shí)無界隊(duì)列同步隊(duì)列隊(duì)列內(nèi)存模型線程通信機(jī)制內(nèi)存共享消息傳遞內(nèi)存模型順序一致性指令重排序原則內(nèi)存語義線程 純分享 , 直接上干貨! 操作系統(tǒng)并發(fā)支持 進(jìn)程管理內(nèi)存管...

    不知名網(wǎng)友 評(píng)論0 收藏0
  • Java深入-框架技巧

    摘要:從使用到原理學(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)階面試問題列表 -...

    chengtao1633 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<