在網(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類的方法和屬性。