類反射
什麼是反射?
JAVA反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為Java語言的反射機制。
反射(Reflection)是Java程式開發語言的特徵之一,它允許執行中的Java程式對自身進行檢查, 也稱自審,並能直接操作程式的內部屬性。例如,使用它能獲得Java類中各成員的名稱並顯示出來。
Java的這一能力在實際應用中應用得很多,在其它的程式語言中根本就不存在這一特性。例如,Pascal、C或者C++中就沒有辦法在程式中獲得函式定義相關的資訊。
JavaBean是類反射的實際應用之一,它能讓一些工具視覺化的操作軟體元件。這些工具通過類反射動態的載入並取得Java元件(類)的屬性。後面學習的各種框架,基本上都會有反射的使用。
反射使用的三個步驟
第一步:獲得你想操作的類的java.lang.Class物件。在執行中的Java程式中,用java.lang.Class類來描述類和介面等。
第二步:呼叫諸如getDeclaredMethods的方法,取得該類中定義的所有方法的列表。
第三步:使用反射的API來操作這些資訊。
如下面這段程式碼:
Class c = Class.forName("java.lang.String");
Method ms[] = c.getDeclaredMethods();
System.out.println(ms[0].toString());
獲取Class物件的三種方法
1.通過物件的getClass方法進行獲取。這種方式需要具體的類和該類的物件,以及呼叫getClass方法。
2.任何資料型別(包括基本資料型別)都具備著一個靜態的屬性class,通過它可直接獲取到該型別對應的Class物件。這種方式要使用具體的類,然後呼叫類中的靜態屬性class完成,無需呼叫方法,效能更好。
3.通過Class.forName()方法獲取。這種方式僅需使用類名,就可以獲取該類的Class物件,更有利於擴充套件。
import org.junit.Test;
/*
* 演示獲取 Class c 物件的三種方法
*/
public class ReflectGetClass {
//法1:通過物件--- 物件.getClass() 來獲取c (一個Class物件)
@Test
public void get1(){
Person p = new Person("Jack",22);
Class c = p.getClass();//來自Object的方法
}
//法2:通過類(型別)----任何資料型別(包括基本資料型別)都有一個靜態的屬性class, 它就是c (一個Class物件)
@Test
public void get2(){
Class c = Person.class;
Class c2 = int.class;
}
//法3(能夠實現解耦):通過字串(類的全名)---- Class.forName( str )
@Test
public void get3(){
try {
Class c = Class.forName("cn.hncu.reflect.one.Person");//類全名
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}