黑马程序员技术交流社区

标题: 什么暴力反射,概念,举个例! [打印本页]

作者: 还记得梦想吗    时间: 2014-2-19 19:45
标题: 什么暴力反射,概念,举个例!
什么暴力反射,概念,举个例!求详细!

作者: joure    时间: 2014-2-19 20:07
暴力反射就是绕过编译器,来操作该类中的private私有字段,普通反射是无法直接获取私有字段的
举一个Field 类反射的例子
        普通反射
        示例: Field field = obj.getClass().getField("变量名")
                                 field.get(obj)        //通过反射获取对象的变量值
                步骤: 1)获取class字节码  2)获取指定的Field对象  3)获取变量值

"暴力反射"
        get方法只能获取声明为 public 的变量,对于私有变量,可以通过getDeclaredField()方法获取 private 变量
        获取对象后要通过 setAccessible(true)方法将该域设置为可访问

        示例:        Field field = obj.getClass().getDeclaredField();        //1)2)获取私有file对象
                        field.setAccessible(true);        //3)将private变量设置为可访问;继承自父类 AccessibleObject 的方法
                        field.get(obj);                //4)获取变量值
作者: joure    时间: 2014-2-19 20:09
使用暴力反射还可以破解单例模式

单例模式的单例并不是绝对安全的,仍可以通过反射来破解
        通过 Constructor<?>[]   getDeclaredConstructors()  获取这个方法获得所有构造器,然后可以得到私有的构造器,
        使用 cons.setAccessible(true) 突破私有构造。然后可以创建无限个单例实例
作者: 一年_Hei    时间: 2014-2-19 20:20
就是名字牛,就是为了访问私有的对象。用setAccessible(true)方法就好了
作者: 山治0712    时间: 2014-2-19 20:58
就是把类类里面一些私有的属性及方法都反射出来叫暴力




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2