這篇文章主要講解了如何使用Java反射技術(shù),內(nèi)容清晰明了,對此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會有幫助。
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),梧州企業(yè)網(wǎng)站建設(shè),梧州品牌網(wǎng)站建設(shè),網(wǎng)站定制,梧州網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,
梧州網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
產(chǎn)生反射技術(shù)的需求:
- 項目完成以后,發(fā)現(xiàn)需要增加功能,并且希望增加功能并不需要停止項目運行。
- 在希望不關(guān)停項目運行的情況下,于是考慮到將功能都放到一個單獨的項目之外的模塊中,每一個功能實現(xiàn)都從這個模塊中獲取【實際上這個考慮應(yīng)該是項目開始前就考慮,這個例子可能不是很好】。于是就有了反射的產(chǎn)生。(這種思想有點類似工廠模式,如果學(xué)過設(shè)計模式的話就明白為什么要做的”開放“)
一個幫助理解例子:
一個網(wǎng)站有計算器功能,剛開始他們只有加減乘除的計算,后來他們決定增加上求乘方、求根號的計算,他們通過“關(guān)停網(wǎng)站后修改源代碼“來增加上他們需要的功能。第二次,他們加上xx功能,他們還是關(guān)停網(wǎng)站加功能。。。。后來他們發(fā)現(xiàn)應(yīng)該把這個”功能模塊“獨立出來,任何功能實現(xiàn)都通過讀取這個文件來實現(xiàn),比如想要實現(xiàn)乘方功能就需要查看這個模塊中是否定義了乘方功能。另外,將它獨立出來后,它一個模塊并不影響整個板塊的功能。
【上面的例子中,其他板塊如果想要知道獨立的模塊的內(nèi)容(屬性、方法),那么就要利用到反射技術(shù),反射技術(shù)可以使程序在運行時解析外部對象的信息?!?/p>
PS:
- 上面的例子有點像某系統(tǒng)從數(shù)據(jù)庫中讀取資料,把資料固定到代碼中顯然是一個很不明智的行為,把數(shù)據(jù)存到數(shù)據(jù)庫中,再利用SQL語句(類比反射技術(shù))從數(shù)據(jù)庫中讀取數(shù)據(jù)就降低了代碼之間的耦合。
- 如果你希望將這個模塊有一個名詞解釋的話,可以把它稱為”配置文件“,有什么功能都可以讀取配置文件來獲取。下面就是講怎么從外部的”配置文件“中讀取具有什么屬性和功能了。
如果你已經(jīng)了解了 為什么需要反射,那么你可以繼續(xù)向下了,如果不了解,那么你可能需要了解更多再深入。
反射的使用:
- 反射技術(shù)是一種動態(tài)語言的技術(shù),它可以動態(tài)的獲取類以及類中的成員,并可以調(diào)用該類成員。
獲取外部字節(jié)碼文件中的類:
- 對于內(nèi)部的類,獲取該類的對象時我們可以使用new
- 但是如果字節(jié)碼文件中獲取類的話,需要Class類,如果通過Class類獲取了一個字節(jié)碼中的類,那么我們再可以直接new這個來獲取一個對象。
- 對于代碼中的類,可以使用 類對象.getClass()來獲取一個字節(jié)碼文件對象。
- 對于代碼中的類,也可以使用 類.class 來獲取一個字節(jié)碼文件對象。
- 對于外部代碼中的類,可以使用Class.forName("類字節(jié)碼文件路徑")來獲取一個字節(jié)碼文件對象【這個類字節(jié)碼文件是classpath中能夠識別的路徑,eclipse中會自動加上一部分classpath】【eclipse中,在每一個project的目錄下都有一個classpath來標(biāo)明字節(jié)碼文件和源代碼文件的位置】【在eclipse中可以方便地使用包名.類名來獲取字節(jié)碼文件】
獲取外部類的對象(獲取構(gòu)造方法):
- 獲取字節(jié)碼文件中的類對象后,可以使用newInstance()來生成一個對象。
- 直接使用Class對象.newInstance()生成的對象默認(rèn)是調(diào)用對應(yīng)類的空參構(gòu)造方法實例化生成的對象。
- 但沒有空參數(shù)的構(gòu)造方法時:
- 1.首先需要獲取構(gòu)造方法來生成指定的對象,可以使用getConstructors()來獲取所有構(gòu)造函數(shù),getConstructor(參數(shù)類型列表)來獲取符合參數(shù)列表的構(gòu)造方法;【1.這里對于getConstructor注意參數(shù)類型列表不是數(shù)據(jù)類型+變量名,而是一個個Class:數(shù)據(jù)類型.class】【2.Constructor是一個存放構(gòu)造器的類?!俊?.獲取的構(gòu)造方法應(yīng)該是public的】
- 2.然后再利用構(gòu)造器對象.newInstance(參數(shù)列表)來實例化對象。
- 如果是非public的構(gòu)造方法,可以使用
getDeclaredConstructor(參數(shù)類型列表)
來獲取構(gòu)造方法。同樣的,getDeclaredConstructors()
是獲取所有不論public還是非public的構(gòu)造方法。
獲取外部對象的屬性:
- 首先通過Class對象獲取變量域field:【Field類用來存儲變量域】
- getField(變量名):獲取指定變量名的public的成員變量
- getFields():獲取所有public的成員變量
- getDeclaredField(變量名):獲取不論public還是非public的指定變量名的成員變量
- getDeclaredFields():獲取不論public還是非public的所有成員變量
- 然后使用Field對象來操作:
- 賦值:Field對象.set(對象名,變量值)
- 獲取值:Field對象.get(對象名)
獲取外部對象的方法:
- 首先通過Class對象獲取方法域method:【Field類用來存儲方法域】
getMethod(方法名, 參數(shù)類型列表)
:獲取public的指定名的方法getMethods()
:獲取public的所有方法getDeclaredMethod(方法名, 參數(shù)類型列表)
:獲取不論public還是非public的指定名的方法【用來獲取私有的方法】
getDeclaredMethods()
:獲取不論public還是非public的方法
然后使用Method對象操作:
補充:
- 如果想使用普通方法就能訪問私有的變量或?qū)傩裕梢允褂?field.setAccesccible(true)
一個小示例:
1.讀取”軟件列表“:
2.通過讀取功能列表來獲知類的字節(jié)碼的路徑
3.開發(fā)"軟件”:
3.給軟件列表加上內(nèi)容:
4.運行
看完上述內(nèi)容,是不是對如何使用Java反射技術(shù)有進一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
當(dāng)前題目:如何使用Java反射技術(shù)-創(chuàng)新互聯(lián)
標(biāo)題路徑:
http://weahome.cn/article/cehooo.html