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.
  • 相关阅读:
    java核心学习笔记(三) java集合框架
    java核心学习笔记(二) 学习环境与学习的方法以及java几个包的作用
    java核心学习笔记(一) javaJDK目录阐述
    版本控制工具git的配置
    linux系统管理员之自动化检测工具 nagios及其插件配置
    运维工程师需要的技能
    在线求中位数(优先队列实现) POJ3784
    并查集 poj1308
    stack HDU1022
    hash数组 POJ1840
  • 原文地址:https://www.cnblogs.com/ChanSS/p/5716554.html
Copyright © 2011-2022 走看看