zoukankan      html  css  js  c++  java
  • 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.
  • 相关阅读:
    HTTP解析
    Linux(CentOS)常用命令
    Windows下虚拟Linux
    国内静态文件CDN服务介绍 国内js公共库
    吐槽一下csdn和博客园
    项目托管 网站 小记
    微软2013年校园实习生招聘笔试题及答案
    最近在折腾VPS(持续完善)
    spring MVC +freemarker + easyui 实现sql查询和执行小工具总结
    Hessian 接口使用示例总结
  • 原文地址:https://www.cnblogs.com/ChanSS/p/5716554.html
Copyright © 2011-2022 走看看