這篇文章主要講解了如何使用Java反射技術(shù),內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供隆陽(yáng)網(wǎng)站建設(shè)、隆陽(yáng)做網(wǎng)站、隆陽(yáng)網(wǎng)站設(shè)計(jì)、隆陽(yáng)網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、隆陽(yáng)企業(yè)網(wǎng)站模板建站服務(wù),十載隆陽(yáng)做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
產(chǎn)生反射技術(shù)的需求:
- 項(xiàng)目完成以后,發(fā)現(xiàn)需要增加功能,并且希望增加功能并不需要停止項(xiàng)目運(yùn)行。
- 在希望不關(guān)停項(xiàng)目運(yùn)行的情況下,于是考慮到將功能都放到一個(gè)單獨(dú)的項(xiàng)目之外的模塊中,每一個(gè)功能實(shí)現(xiàn)都從這個(gè)模塊中獲取【實(shí)際上這個(gè)考慮應(yīng)該是項(xiàng)目開(kāi)始前就考慮,這個(gè)例子可能不是很好】。于是就有了反射的產(chǎn)生。(這種思想有點(diǎn)類似工廠模式,如果學(xué)過(guò)設(shè)計(jì)模式的話就明白為什么要做的”開(kāi)放“)
一個(gè)幫助理解例子:
一個(gè)網(wǎng)站有計(jì)算器功能,剛開(kāi)始他們只有加減乘除的計(jì)算,后來(lái)他們決定增加上求乘方、求根號(hào)的計(jì)算,他們通過(guò)“關(guān)停網(wǎng)站后修改源代碼“來(lái)增加上他們需要的功能。第二次,他們加上x(chóng)x功能,他們還是關(guān)停網(wǎng)站加功能。。。。后來(lái)他們發(fā)現(xiàn)應(yīng)該把這個(gè)”功能模塊“獨(dú)立出來(lái),任何功能實(shí)現(xiàn)都通過(guò)讀取這個(gè)文件來(lái)實(shí)現(xiàn),比如想要實(shí)現(xiàn)乘方功能就需要查看這個(gè)模塊中是否定義了乘方功能。另外,將它獨(dú)立出來(lái)后,它一個(gè)模塊并不影響整個(gè)板塊的功能。
【上面的例子中,其他板塊如果想要知道獨(dú)立的模塊的內(nèi)容(屬性、方法),那么就要利用到反射技術(shù),反射技術(shù)可以使程序在運(yùn)行時(shí)解析外部對(duì)象的信息。】
PS:
- 上面的例子有點(diǎn)像某系統(tǒng)從數(shù)據(jù)庫(kù)中讀取資料,把資料固定到代碼中顯然是一個(gè)很不明智的行為,把數(shù)據(jù)存到數(shù)據(jù)庫(kù)中,再利用SQL語(yǔ)句(類比反射技術(shù))從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)就降低了代碼之間的耦合。
- 如果你希望將這個(gè)模塊有一個(gè)名詞解釋的話,可以把它稱為”配置文件“,有什么功能都可以讀取配置文件來(lái)獲取。下面就是講怎么從外部的”配置文件“中讀取具有什么屬性和功能了。
如果你已經(jīng)了解了 為什么需要反射,那么你可以繼續(xù)向下了,如果不了解,那么你可能需要了解更多再深入。
反射的使用:
- 反射技術(shù)是一種動(dòng)態(tài)語(yǔ)言的技術(shù),它可以動(dòng)態(tài)的獲取類以及類中的成員,并可以調(diào)用該類成員。
獲取外部字節(jié)碼文件中的類:
- 對(duì)于內(nèi)部的類,獲取該類的對(duì)象時(shí)我們可以使用new
- 但是如果字節(jié)碼文件中獲取類的話,需要Class類,如果通過(guò)Class類獲取了一個(gè)字節(jié)碼中的類,那么我們?cè)倏梢灾苯觧ew這個(gè)來(lái)獲取一個(gè)對(duì)象。
- 對(duì)于代碼中的類,可以使用 類對(duì)象.getClass()來(lái)獲取一個(gè)字節(jié)碼文件對(duì)象。
- 對(duì)于代碼中的類,也可以使用 類.class 來(lái)獲取一個(gè)字節(jié)碼文件對(duì)象。
- 對(duì)于外部代碼中的類,可以使用Class.forName("類字節(jié)碼文件路徑")來(lái)獲取一個(gè)字節(jié)碼文件對(duì)象【這個(gè)類字節(jié)碼文件是classpath中能夠識(shí)別的路徑,eclipse中會(huì)自動(dòng)加上一部分classpath】【eclipse中,在每一個(gè)project的目錄下都有一個(gè)classpath來(lái)標(biāo)明字節(jié)碼文件和源代碼文件的位置】【在eclipse中可以方便地使用包名.類名來(lái)獲取字節(jié)碼文件】
獲取外部類的對(duì)象(獲取構(gòu)造方法):
- 獲取字節(jié)碼文件中的類對(duì)象后,可以使用newInstance()來(lái)生成一個(gè)對(duì)象。
- 直接使用Class對(duì)象.newInstance()生成的對(duì)象默認(rèn)是調(diào)用對(duì)應(yīng)類的空參構(gòu)造方法實(shí)例化生成的對(duì)象。
- 但沒(méi)有空參數(shù)的構(gòu)造方法時(shí):
- 1.首先需要獲取構(gòu)造方法來(lái)生成指定的對(duì)象,可以使用getConstructors()來(lái)獲取所有構(gòu)造函數(shù),getConstructor(參數(shù)類型列表)來(lái)獲取符合參數(shù)列表的構(gòu)造方法;【1.這里對(duì)于getConstructor注意參數(shù)類型列表不是數(shù)據(jù)類型+變量名,而是一個(gè)個(gè)Class:數(shù)據(jù)類型.class】【2.Constructor是一個(gè)存放構(gòu)造器的類。】【3.獲取的構(gòu)造方法應(yīng)該是public的】
- 2.然后再利用構(gòu)造器對(duì)象.newInstance(參數(shù)列表)來(lái)實(shí)例化對(duì)象。
- 如果是非public的構(gòu)造方法,可以使用
getDeclaredConstructor(參數(shù)類型列表)
來(lái)獲取構(gòu)造方法。同樣的,getDeclaredConstructors()
是獲取所有不論public還是非public的構(gòu)造方法。
獲取外部對(duì)象的屬性:
- 首先通過(guò)Class對(duì)象獲取變量域field:【Field類用來(lái)存儲(chǔ)變量域】
- getField(變量名):獲取指定變量名的public的成員變量
- getFields():獲取所有public的成員變量
- getDeclaredField(變量名):獲取不論public還是非public的指定變量名的成員變量
- getDeclaredFields():獲取不論public還是非public的所有成員變量
- 然后使用Field對(duì)象來(lái)操作:
- 賦值:Field對(duì)象.set(對(duì)象名,變量值)
- 獲取值:Field對(duì)象.get(對(duì)象名)
獲取外部對(duì)象的方法:
- 首先通過(guò)Class對(duì)象獲取方法域method:【Field類用來(lái)存儲(chǔ)方法域】
getMethod(方法名, 參數(shù)類型列表)
:獲取public的指定名的方法getMethods()
:獲取public的所有方法getDeclaredMethod(方法名, 參數(shù)類型列表)
:獲取不論public還是非public的指定名的方法【用來(lái)獲取私有的方法】
getDeclaredMethods()
:獲取不論public還是非public的方法
然后使用Method對(duì)象操作:
非靜態(tài)方法調(diào)用:Method對(duì)象.invoke(對(duì)象名,對(duì)象名…)
靜態(tài)方法調(diào)用:Method對(duì)象.invoke(null)
補(bǔ)充:
- 如果想使用普通方法就能訪問(wèn)私有的變量或?qū)傩?,可以使?field.setAccesccible(true)
一個(gè)小示例:
1.讀取”軟件列表“:
2.通過(guò)讀取功能列表來(lái)獲知類的字節(jié)碼的路徑
3.開(kāi)發(fā)"軟件”:
3.給軟件列表加上內(nèi)容:
4.運(yùn)行
看完上述內(nèi)容,是不是對(duì)如何使用Java反射技術(shù)有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
名稱欄目:如何使用Java反射技術(shù)
分享地址:http://muchs.cn/article44/iejsee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、網(wǎng)站維護(hù)、全網(wǎng)營(yíng)銷推廣、微信小程序、營(yíng)銷型網(wǎng)站建設(shè)、做網(wǎng)站
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源:
創(chuàng)新互聯(lián)