學(xué)習(xí)筆記 | JAVA的反射(一)

在網(wǎng)上搜索,對JAVA反射的定義,是這樣解釋的:

JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機(jī)制。要想解剖一個類,必須先要獲取到該類的字節(jié)碼文件對象。而解剖使用的就是Class類中的方法.所以先要獲取到每一個字節(jié)碼文件對應(yīng)的Class類型的對象.

解讀這一段話,什么是反射機(jī)制呢?就是說在運(yùn)行時,對于任何一個類或?qū)ο?,我們都能知道它所擁有的方法和屬性,并使用它們?/p>

這是怎么做到的呢?面向?qū)ο笳Z言有一種說法:一切皆對象。即在JAVA中,我們把所有的東西都看作成對象,那所謂的“任意一個類”呢?它當(dāng)然也是對象,打比方說,我們定義了一個新的類,名字叫做A,那這個A雖然是一個類,可以創(chuàng)建自己的對象,但是它自身也是一個對象(即java.lang.Class的實例對象)。

那如何表示這個實例對象呢?

按照以往的思路,我們創(chuàng)建一個對象時,可以這樣 Student stu = new Student();,這個stu就是一個Student類的實例對象,而Class類的實例對象比較特殊,我們不能通過new來獲取它,要如何獲取Class的實例對象有三種方法:

Class c1 = stu.getClass(); | 所有的類都繼承了Object類,通過使用Object的getClass()方法獲得c1。

Class c2 =?Student.class; | 使用靜態(tài)的class屬性獲取c2。

Class c3 =?Class.forName("xxx.xxx.Student); | 使用Class類的forName()方法獲取c3。(常用)

Student這個類,它也是java.lang.Class的一個實例對象,怎么表示這個實例呢?我們就可以使用,c1,c2,c3來表示它,又因為c1,c2,c3所表示的都是Student這個類,所以說c1,c2,c3是完全相同的,也可以理解為每一個類,只有一個Class實例產(chǎn)生。

那好了,這樣就獲得了Class類的實例對象c1,也有人把它稱作Student類的類類型,這個東西也就是前文概念中所描述的“該類的字節(jié)碼文件對象”。之后,就可以使用這個c1調(diào)用Class類中內(nèi)置的一些方法,來獲取我們想知道的東西,即可以通過c1來獲得Student類的方法和屬性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容