在java中,如果类里面的变量是声明了private的,那么只能在被类中访问,外界不能调用,如果是protected类型的,只能在子类或本包中调用,俗话说没有不透风的墙。但是可以利用java中的反射从而在外界调用private、protected的变量或方法
package reflect; public class PrivateCar { //private成员变量:在传统的类实例调用方式,只能在本类中访问 private String color; //protected方法:使用传统的类实例调用方式,只能在子类和本包中访问 protected void drive(){ System.out.println("this is private car! the color is:"+color); } }
这里定义了一个类,有一个private的变量color
还有一个protected的方法drive();
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 colorFld = clazz.getDeclaredField("color"); //取消java语言访问检查以访问private变量 colorFld.setAccessible(true); colorFld.set(pcar, "红色"); Method driveMtd = clazz.getDeclaredMethod("drive"); //取消java语言访问检查以访问protected方法 driveMtd.setAccessible(true); driveMtd.invoke(pcar, (Object[])null); } }
在访问private、protected成员变量或方法是必须通过
setAccessible(true); 方法取消java语言检查,否则将抛出IllegalAccessException.