您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“什么是reflectJava的反射機(jī)制”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
Reflection 是 Java 程序開發(fā)語言的特征之一,它允許運(yùn)行中的 Java 程序?qū)ψ陨磉M(jìn)行檢查,或者說“自審”,并能直接操作程序的內(nèi)部屬性。Java 的這一能力在實(shí)際應(yīng)用中也許用得不是很多,但是在其它的程序設(shè)計(jì)語言中根本就不存在這一特性。
一、類型識別的兩種方式:
首先了解一下“運(yùn)行時類型識別”(Run-time Type Identification, RTTI)主要有兩種方式,
***種:是我們在一次編譯時和運(yùn)行時已經(jīng)知道了所有的類型。
第二種:是我們在整項(xiàng)目分模塊的編譯,在運(yùn)行時可以對新加入的模塊進(jìn)行動態(tài)的編譯。(在動態(tài)編譯模塊之前還不知道被編譯code的類型。) 這就是下面要接受的,功能強(qiáng)大的“反射”機(jī)制。
二、認(rèn)識“Class對象”:
要理解RTTI(運(yùn)行時類型識別)在Java中的工作原理,首先必須知道類型信息在運(yùn)行時是如何表示的,這項(xiàng)工作是由“Class對象”完成的,它包含了與類有關(guān)的信息。
類是程序的重要組成部分(類的屬性,方法以及它的一些特性,在這里我就不做贅述了。),每個類都有一個Class對象,每當(dāng)編寫并編譯了一個新類就會產(chǎn)生一個Class對象,它被保存在一個與你所創(chuàng)建的新類同名的.class文件中。那么在程序運(yùn)行時,當(dāng)我們想生成這個類的對象時(實(shí)例化這個類),運(yùn)行這個程序的Java虛擬機(jī)(JVM)就會這樣做:
首先會從加載所創(chuàng)新類的.class文件,
然后確認(rèn)這個新類的Class對象是否已經(jīng)加載,如果尚未加載,JVM就會根據(jù)類名查找.class文件,并將其載入,一旦這個類的Class對象被載入內(nèi)存,它就被用來創(chuàng)建這個類的所有對象。
一般的RTTI形式包括三種:
1.傳統(tǒng)的類型轉(zhuǎn)換。如“(Apple)Fruit”,由RTTI確保類型轉(zhuǎn)換的正確性,如果執(zhí)行了一個錯誤的類型轉(zhuǎn)換,就會拋出一個ClassCastException異常。
2.通過Class對象來獲取對象的類型。如
[code="java"] Class c = Class.forName(“Apple”);
Object o = c.newInstance();
3.通過關(guān)鍵字instanceof或Class.isInstance()方法來確定對象是否屬于某個特定類型的實(shí)例,準(zhǔn)確的說,應(yīng)該是instanceof / Class.isInstance()可以用來確定對象是否屬于某個特定類及其所有基類的實(shí)例,這和equals() / ==不一樣,它們用來比較兩個對象是否屬于同一個類的實(shí)例,沒有考慮繼承關(guān)系。[enxtpage]
三、反射
如果不知道某個對象的類型,可以通過RTTI來獲取,但前提是這個類型在編譯時必須已知,這樣才能使用RTTI來識別。即在編譯時,編譯器必須知道所有通過RTTI來處理的類。
使用反射機(jī)制可以不受這個限制,它主要應(yīng)用于兩種情況:
***種情況,是“基于構(gòu)件的編程”這種編程方式中,將使用某種基于快速應(yīng)用開發(fā)(RAD)的應(yīng)用構(gòu)建工具來構(gòu)建項(xiàng)目。這是現(xiàn)在最常見的可視化編程方法,通過代表不同組件的圖標(biāo)拖動到圖板上,然后設(shè)置”構(gòu)件“(組件)的屬性值來配置它們來創(chuàng)建程序。
要做到這種配置編程,就必須要求構(gòu)件都是可實(shí)例化的,并且要暴露其部分信息,使得程序員可以讀取和設(shè)置構(gòu)件的值和狀態(tài)。當(dāng)處理GUI時間的構(gòu)件時還必須暴露相關(guān)方法的事件處理細(xì)節(jié),以便RAD環(huán)境幫助程序員覆蓋這些處理事件的方法。在這里,就要用到反射的機(jī)制來檢查可用的方法并返回方法實(shí)體對象。Java通過JavaBeans提供了基于構(gòu)件的編程架構(gòu)。
第二種情況,在運(yùn)行時獲取類的信息的另外一個動機(jī),就是希望能夠提供在跨網(wǎng)絡(luò)的遠(yuǎn)程平臺上創(chuàng)建和運(yùn)行對象的能力。這被成為遠(yuǎn)程調(diào)用(RMI),它允許一個Java程序?qū)ο蠓植皆诙嗯_機(jī)器上,這種分步能力將幫助開發(fā)人員執(zhí)行一些需要進(jìn)行大量計(jì)算的任務(wù),充分利用計(jì)算機(jī)資源,提高運(yùn)行速度。
Class類支持反射,是在java.lang.reflect中包含了Field/Method/Constructor類,每個類都實(shí)現(xiàn)了Member接口。這些類型的對象都是由JVM在運(yùn)行時創(chuàng)建的,用來表示未知類里對應(yīng)的成員。如可以用Constructor類創(chuàng)建新的對象,用get()和set()方法讀取和修改與Field對象關(guān)聯(lián)的字段,用invoke()方法調(diào)用與Method對象關(guān)聯(lián)的方法。
同時,還可以調(diào)用getFields()、getMethods()、getConstructors()等方法來返回表示字段、方法以及構(gòu)造器的對象數(shù)組。這樣,未知的對象的類信息在運(yùn)行時就能被完全確定下來,而在編譯時不需要知道任何信息。
另外,RTTI有時能解決效率問題。當(dāng)程序中使用多態(tài)給程序的運(yùn)行帶來負(fù)擔(dān)的時候,可以使用RTTI編寫一段代碼來提高效率。
“什么是reflectJava的反射機(jī)制”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。