藉助於Java的反射機制,我們可以訪問一個類的私有成員及私有函數
Accessing Private Fields
在前面,我們說過,Class.getField(String)以及Class.getFields()這兩個方法只能返回public的成員。
如果想訪問private成員,需要使用函數Class.getDeclaredField(String)和Class.getDeclaredFields(),如下
public class A {
private String m;
public A(String m) {
this.m = m;
}
}
public class B {
public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
A objA = new A("Hello Ruby");
Field field = A.class.getDeclaredField("m"); // 不能返回父類的成員
field.setAccessible(true); // 將原本私有的field變量設置爲可見
String value = (String)field.get(objA);
System.out.println(value); // 結果爲 Hello Ruby
}
}
Accessing Private Methods
通過Class.getMethod(String, Class[] parameterTypes)以及Class.getMethods()只能返回一個類中的public方法。
如果想訪問private方法,需要Class.getDeclaredMethod(String name, Class[] parameterTypes)以及Class.getMethods(),如下
public class A {
private String m;
public A(String m) {
this.m = m;
}
private String f() {
return m;
}
}
public class B {
public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
A objA = new A("Hello Ruby");
Method method1 = A.class.getDeclaredMethod("f", null);
method1.setAccessible(true);
String value = (String)method1.invoke(objA, null);
System.out.println(value);
}
}