藉助於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);}}