A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 还记得梦想吗 中级黑马   /  2014-2-19 19:45  /  1042 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

什么暴力反射,概念,举个例!求详细!

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

5 个回复

倒序浏览
暴力反射就是绕过编译器,来操作该类中的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)获取变量值

点评

复习了  发表于 2014-9-5 15:25

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报 1 0
使用暴力反射还可以破解单例模式

单例模式的单例并不是绝对安全的,仍可以通过反射来破解
        通过 Constructor<?>[]   getDeclaredConstructors()  获取这个方法获得所有构造器,然后可以得到私有的构造器,
        使用 cons.setAccessible(true) 突破私有构造。然后可以创建无限个单例实例

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
一年_Hei 来自手机 中级黑马 2014-2-19 20:20:32
板凳
就是名字牛,就是为了访问私有的对象。用setAccessible(true)方法就好了

评分

参与人数 1技术分 +2 收起 理由
滔哥 + 2 赞一个!

查看全部评分

回复 使用道具 举报
就是把类类里面一些私有的属性及方法都反射出来叫暴力
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马