java利用反射绕过私有检查机制实行对private、protected成员变量或方法的访问

在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.
posted @ 2016-07-28 22:52  众里寻他壹贰度  阅读(9233)  评论(0编辑  收藏  举报