在java.lang.reflect包中有三個類Field,Method,Constructor.分別描述域,方法,構造器。參考API,關於這三個類的說明。
在運行時使用反射分析對象,如果訪問的是私人域或是私人方法,私人建構函式,會拋出IllegalAccessException.因為反射機制的預設行為受限於java的存取控制,然而,如果一個java程式沒有受到安全管理器的控制,就可以覆蓋存取控制。為了達到這個目的,需要調用Field,Method,Constructor對象的setAccessible方法,setAccessible方法是AccessibleObject類的一個方法,是Field,Method,Constructor類的公用超類。
setAccessible(true);
不要過多地使用反射:破壞類封裝;效率偏低;編譯器不容易協助發現錯誤,在運行時才會被發現。
我使用反射,是為了寫單元測試代碼,對運行對象的分析,改變對象的私人域等,達到測試需要的覆蓋率。
以下提供代碼案例:
測試類別: public class RunBing ... {
private String name;
private int age;
public String sex;
public RunBing() ...{
}
private RunBing(String name) ...{
this.name = name;
}
public void setName(String name) ...{
this.name = name;
}
public void setAge(int age) ...{
this.age = age;
}
public String getName() ...{
return name;
}
public int getAge() ...{
return age;
}
public String run() ...{
return "run method";
}
private String add() ...{
return "add method";
}
}
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Constructor;
public class ReflectHelp ... {
/** *//**
* 通過構造器取得執行個體
* @param className 類的全限定名
* @param intArgsClass 建構函式的參數類型
* @param intArgs 建構函式的參數值
*
* @return Object
*/
public static Object getObjectByConstructor(String className,Class[] intArgsClass,Object[] intArgs)...{
Object returnObj= null;
try ...{
Class classType = Class.forName(className);
Constructor constructor = classType.getDeclaredConstructor(intArgsClass); //找到指定的構造方法
constructor.setAccessible(true);//設定安全檢查,訪問私人建構函式必須
returnObj = constructor.newInstance(intArgs);
} catch (NoSuchMethodException ex) ...{
ex.printStackTrace();
&