美文网首页
利用反射绕过封装 访问私有属性/方法

利用反射绕过封装 访问私有属性/方法

作者: hello_world_cxm | 来源:发表于2021-02-05 22:09 被阅读0次
    package day0205;
    
    import java.lang.reflect.*;
    
    public class TestReflection_1 {
        //利用反射来绕开封装
        public static void main(String[] args) throws Exception{
            Class<?> c = Class.forName("day0205.Student");  //创建类对象
            //getConstructor(String.class,int.class) 根据特定的参数表 获取特定的构造方法 然后.newInstance()创建构造方法对象同时要给特定参数表 
            Object o = c.getConstructor(String.class,int.class).newInstance("liucy",20);  //调用无参构造方法 创建类的对象
            //利用反射技术绕过封装访问私有属性以及方法
            System.out.println("------------------------------------访问方法");
    //      Method m1 = c.getMethod("study");  //获取方法对象
    //      m1.invoke(o);
            Method m2 = c.getDeclaredMethod("study", null);  //getDeclaredMethod()能访问类中的私有属性/方法
            m2.setAccessible(true);  //关键代码 将访问权限设置为true
            m2.invoke(o);  //这时候私有方法成功被调用
            System.out.println("------------------------------------访问私有属性");
            //Field f = c.getField("name");  //不能访问私有属性
            Field f = c.getDeclaredField("name");
            f.setAccessible(true);  //成功获取私有属性
            Object s = f.get(o);  //获取类的对象 属性的值
            f.set(o, "cxm");      //给属性重新赋值
            Object s1 = f.get(o);  //获取类的对象 属性的值
            System.out.println(s1);
            
    
        }
    
    }
    class Student{
        private String name;
        int age;
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
            System.out.println(name + age +"  有参构造方法被调用了");
        }
        private void study() {
            System.out.println("study 方法被访问了");
        }
        
    }
    
    

    相关文章

      网友评论

          本文标题:利用反射绕过封装 访问私有属性/方法

          本文链接:https://www.haomeiwen.com/subject/knagtltx.html