借助于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);
}
}