在java类中,private成员一般只有在本类中才可以访问,在这里我们将通过java反射机制从外部类中访问private成员。
首先我们写一个类:
PrivateCar.java
package reflect;
public class PrivateCar {
private String color;
protected void drive(){
System.out.println("drive
private car!the color is:"+color);
}
}
再写个测试类以访问PrivateCar中的color属性。
PrivateCarReflect.java
package reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class PrivateCarReflect {
public static void main(String args[])throws Throwable{
ClassLoader
loader=Thread.currentThread().getContextClassLoader();
Class
clazz=loader.loadClass("reflect.PrivateCar");
PrivateCar
pcar=(PrivateCar)clazz.newInstance();
Field
colorFid=clazz.getDeclaredField("color");
colorFid.setAccessible(true);//取消java语言访问检查以访问private变量
colorFid.set(pcar, "红色");
Method
driveMtd=clazz.getDeclaredMethod("drive", (Class[])null);
driveMtd.setAccessible(true);
driveMtd.invoke(pcar,
(Object[])null);
}
}
最后打印结果为:drive private car!the color is:红色。
在访问private、protected成员变量和方法时必须通过setAccessible方法取消java语言检查,否则将会抛出IllegalAccessExcepion。如果JVM的安全管理器设置了相应的安全机制,调用该方法将抛出SecurityException.