Java反射機制簡介
一、反射的作用
在Java中我們建立物件時一般都是類名+物件名。但反射給我們提供了另一種建立物件的方法,採用這種方法時,我們只需要知道類的名字就可以建立物件了。並且不需要知道類中的方法就可以直接使用。其作用就是在改寫程式時較為方便,比如有一個類Class1,如果使用new Class1()來建立物件,那麼當我們要換一個類Class2時就要重新改寫程式碼進行編譯;但如果使用反射class.forName(“Class1”).newInstance()來建立物件的話,要修改成Class2就只需要將class.forName(“Class1”).newInstance()中的Class1換成Class2即可。
二、獲取一個類的構造方法
要獲取一個類的構造方法首先要獲取這個類,下面這句話可以實現Class c = Class.forName(“reflect.TestClass”)(TestClass是類名,reflect是包名)使用class類中的getDeclaredConstructor()方法可以獲得在此類中宣告的一個構造方法,根據傳入的引數不同可以獲得不同的構造方法(如果有多個的話),另一個方法getDeclaredConstructors()可以獲得此類所有已宣告的構造方法,程式碼如下
//若傳入引數為int型可以寫成這樣 Constructor con1=c.getConstructor(int.class); //獲取所有構造方法 Constructor[] con1=c.getDeclaredConstructors(); 建立物件可以用這個語句 //傳入引數為11建立物件 Object obj1=con1.newInstance(11);
三、獲取一個類的普通方法
在獲取一個類後,使用getDeclaredMethod()方法可以獲得在此類中宣告的一個方法(無論公有還是私有),而使用getMethod()方法可以獲取此類或從此類的父類中繼承的公有方法
而使用getDeclaredMethods()和getMethods()方法可以獲取上面對應的所有方法,程式碼如下
//輸入方法名和要傳入的引數獲取方法 Method m1=c.getDeclaredMethod("fun1", int.class); System.out.println(m1); //getDeclaredMethods()獲取自己在該類中宣告的方法 Method[] m2=c.getDeclaredMethods(); //getMethods()獲取該類全部公有方法(包括從父類繼承的,私有方法無法獲取) Method[] m3=c.getMethods(); System.out.println(m1); System.out.println(m2.length); System.out.println(m3.length);
執行結果如下
public void reflect.TestClass.fun1(int)
4
11
四、獲取一個類的屬性
獲取一個類的屬性和獲取方法差不多,有多種方法可以使用,參照第三點,下面看程式碼
//獲取此類中的一個變數(無論公有私有)
Field f1=c.getDeclaredField("data1");
//獲取此類中宣告的所有變數(無論公有私有)
Field[] f2=c.getDeclaredFields();
//獲取此類及其父類中所有公有變數
Field[] f3=c.getFields();
System.out.println(f1);
System.out.println(f2.length);
System.out.println(f3.length);
執行結果如下
public int reflect.TestClass.data1
4
2
五、關於私有屬性賦值以及私有方法呼叫
私有方法一般不能在類外使用,但運用反射時又要使用,這時可以使用setAccessible()方法改變訪問許可權,程式碼如下
//m為已獲取的方法
m1.setAccessible(true);
//obj1為該方法所屬物件,11為傳入該方法的引數
m1.invoke(obj1,11);
對屬性賦值時也是一樣
//f1為已獲取的方法
f1.setAccessible(true);
f1.setInt(obj1, 1);
System.out.println(f1.getInt(obj1));
輸出結果
11