1. 程式人生 > >Java反射機制簡介

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