運用反射訪問類的私人方法是一件比較有趣的事情,這個對於類的測試也很有實用價值。
例如下面的ClassA是要訪問的類 :
package reflecttest;
public class ClassA {
private String id;
public ClassA(String id){
this.id = id;
}
public String getId() {
return id;
}
private void setId(String id) {
this.id = id;
}
}
下面為實現訪問的簡單例子:
package reflecttest;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ReflectSample {
public static void main(String[] args) {
try {
//要被載入的類名,可以通過設定檔指定
String className = "reflecttest.ClassA";
//根據類名載入類
Class c = Class.forName(className);
//設定構造器參數
Class[] paramTypes = new Class[1];
paramTypes[0] = String.class;
//產生構造器
Constructor cs = c.getConstructor(paramTypes);
//設定構造器參數值
Object[] paramValue = new Object[1];
paramValue[0] = "testID";
//構造類執行個體
Object obj = cs.newInstance(paramValue);
//調用類中的方法: getId()
String methodNameA = "getId";
Method mA = c.getMethod(methodNameA, null);
System.out.println(mA.invoke(obj, null));
//調用類中的方法: setId()
String methodNameB = "setId";
Method mB = c.getMethod(methodNameB, new Class[]{String.class});
mB.invoke(obj, new Object[]{"newId"});
//查看修改後的結果
System.out.println(mA.invoke(obj, null));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}