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.
  • 相关阅读:
    ntp
    mknod
    timeout/timelimit
    Eclipse 包变成文件夹
    Eclipse 包变成文件夹
    Java生成随机字符串和随即生成10以内的字符串
    Java生成随机字符串和随即生成10以内的字符串
    插入排序
    插入排序
    Java 中基本类型和包装类之间的转换
  • 原文地址:https://www.cnblogs.com/ChanSS/p/5716554.html
Copyright © 2011-2022 走看看