java反射是怎么實(shí)現(xiàn)的?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
公司主營(yíng)業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)推出永安免費(fèi)做網(wǎng)站回饋大家。
反射是啥?
反射既然有“反”,就說(shuō)明它是一個(gè)逆向的過(guò)程。那我們先來(lái)看看正向過(guò)程是怎樣的。
設(shè)計(jì)一個(gè)類,類實(shí)例化成對(duì)象,對(duì)象調(diào)方法或?qū)傩匀?shí)現(xiàn)一些功能。
那反射是什么呢?
不知道大家是否還記得上圖,這是剛接觸java時(shí)學(xué)到的知識(shí)。我自己的理解是現(xiàn)在是知道1,反推到2,然后再通過(guò)2得到一些別的信息。(這只是我的推測(cè),至于具體是不是,還需日后深究)
類比到現(xiàn)實(shí)中的場(chǎng)景是:
你:媽媽,你知道剪刀在哪嗎? 媽媽:我那天放針線的時(shí)候好像在針線盒里看到了,你去找找有沒(méi)有。針線盒在客廳的茶幾上。 你:好的。
然后你從“針線”推導(dǎo)出了“針線盒”,再?gòu)摹搬樉€盒”中找到了“剪刀”。
我們的反射就是:從類或?qū)ο笾型茖?dǎo)出Class類,然后再?gòu)腃lass類中獲得類的信息。
更迷糊了?不急,請(qǐng)往下看。
找到針線盒——獲取Class類
先開(kāi)始說(shuō)Class類是什么?
Class類就是People類的類,就像People類是p的類一樣。Class類是p的“爺爺”。
我們可以這樣理解:java.lang.Class的實(shí)例對(duì)象是People,People的實(shí)例對(duì)象是p。我們的思路就是通過(guò)People類或p對(duì)象獲得Class類,然后再通過(guò)Class類獲取People類的信息,比如屬性,方法,構(gòu)造函數(shù)等等。
知道了Class類是什么,那我們說(shuō)說(shuō)怎么才能獲取它。
找到Class類有3種方法:
值得一提的是,c1、c2、c3叫做People類的“類類型”。好了,現(xiàn)在我們總結(jié)一下已知條件:
People:類
p:對(duì)象
c:類類型
找到剪刀——獲取People類的信息
應(yīng)用一:獲取類的全部方法
在獲取People類的方法中,ms是一個(gè)存放著People類方法的數(shù)組,通過(guò)循環(huán),一層層獲取它的名稱、參數(shù)類型、返回值。
最后直接在main函數(shù)中調(diào)用即可
得到的部分結(jié)果如下:
應(yīng)用二:獲取類的全部屬性
調(diào)用和調(diào)用方法類似:
運(yùn)行結(jié)果:
應(yīng)用三:獲取類的構(gòu)造函數(shù)
構(gòu)造函數(shù)類似,不再贅述。
應(yīng)用四:獲取類的某個(gè)特定方法
運(yùn)行結(jié)果如下,兩種調(diào)用方式結(jié)果相同:
以上只是對(duì)個(gè)別功能的列舉,更具體的可以去API文檔中尋找:http://tool.oschina.net/apidocs/apidoc?api=jdk-zh
反射的概念
在文章的最后,我們總結(jié)一下反射的概念,讓思想升華一下。
反射的定義是什么?
JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法,這種動(dòng)態(tài)獲取、調(diào)用對(duì)象方法的功能稱為java語(yǔ)言的反射機(jī)制。
反射存在的必要性?
“反射機(jī)制是很多java框架的基石”。
(1)在xml文件或者properties里面寫好了配置,然后在Java類里面解析xml或properties里面的內(nèi)容,得到一個(gè)字符串,然后用反射機(jī)制,根據(jù)這個(gè)字符串獲得某個(gè)類的Class實(shí)例,這樣就可以動(dòng)態(tài)配置一些東西,不用每一次都要在代碼里面去new或者做其他的事情,以后要改的話直接改配置文件,代碼維護(hù)起來(lái)就很方便了。
(2)有時(shí)候要適應(yīng)某些需求,Java類里面不一定能直接調(diào)用另外的方法,這時(shí)候也可以通過(guò)反射機(jī)制來(lái)實(shí)現(xiàn)。
反射的缺點(diǎn)?
我們?cè)诖a中也能看到,反射的代碼比正常調(diào)用的代碼更多,性能也慢,所以應(yīng)避免使用反射。這就相當(dāng)于如果你本來(lái)就知道剪刀在哪,就沒(méi)必要再通過(guò)針線——針線盒——剪刀這條路了。
是否使用反射的標(biāo)準(zhǔn)是啥?
如果一個(gè)功能可以不用反射完成,那么最好就不用。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。