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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wangkerui 中级黑马   /  2014-5-8 19:30  /  7424 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 wangkerui 于 2014-5-10 18:02 编辑

什么是暴力反射啊,听力张老师的讲解还是不太明白,求指导啊!最好有实例是的

16 个回复

倒序浏览
本帖最后由 曹冬明 于 2014-5-8 19:40 编辑

反射里的Constructor,Field,Method三个类都有一个getDeclaredXxx方法,可以不受权限控制的获取类的构造函数,字段,方法,如果想要私有构造函数创建对象,字段赋值,方法调用的话,会自动的访问类的isAccessable,默认的是false,所以,你要想访问类中的私有成员的时候,就要调用setAccessable方法,将其改为true,这样,你就可以对类中的私有成员进行操作了

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
很简单,就是当一个类中成员是私有的, 必须通过getDes*****方法来调用,并调用setAccessible(true);然后才能用。这个就是暴力反射
回复 使用道具 举报
如果成员变量是私有的,那么getField方法将获取不到该变量,这时需要方法getDeclaredField方法获取,但是获取了该变量也不能取出指定对象对应的变量值,这时需要设置标志.setAccessible(true);这样就能获得对象的变量值了。这个过程是强取,即暴力反射。
回复 使用道具 举报
展示片段:
反射成员变量:Field 类代表某个类中的成员变量
     //1.获取Class对象
     Class clazz=Class.forName("com.itheima.bean.Person")
             Object obj=clazz.newInstance();  //初始化
     //fl 对象存储的是Person类country 属性值和它所属的对象
     Field fl = clazz.getField("country"); //getField()获得的public 共有的成员country(国家)
   
     //暴力反射  ,getField只能访问共有的成员属性,私有成员的getDeclaredField
     Field fl2 = clazz.getDeclaredField("name"); //获取类成员,包括private私有的成员
           fl2.setAccessible(true);//这时需要设置标志,setAccessible 默认是false
       强制获取私有成员信息,即暴力反射。
回复 使用道具 举报
上面的都解释的很好.......
回复 使用道具 举报
一切私有的在暴力反射面前都会暴露本性,个人感觉如果各种封装是一道墙,反射就是迂回到墙后釜底抽薪
回复 使用道具 举报
godot 中级黑马 2015-3-25 14:26:37
8#
我也懂了
回复 使用道具 举报
很好,好像懂一些了
回复 使用道具 举报
学习了                     
回复 使用道具 举报
就是本来通过类对象不能使用的一些特性,通过反射就破解了,上面大家都说的不错 学习了
回复 使用道具 举报
曹冬明 发表于 2014-5-8 19:38
反射里的Constructor,Field,Method三个类都有一个getDeclaredXxx方法,可以不受权限控制的获取类的构造函 ...

写的很明白,终于懂了。非诚感谢
回复 使用道具 举报
懂了
               
回复 使用道具 举报
kamo 中级黑马 2015-10-9 20:24:03
14#
学习了,,,3q
回复 使用道具 举报
不错哦~~~~~~~~~~~~~~
回复 使用道具 举报
新生小周 发表于 2015-2-26 23:24
一切私有的在暴力反射面前都会暴露本性,个人感觉如果各种封装是一道墙,反射就是迂回到墙后釜底抽薪 ...

回复 使用道具 举报
太棒了~~~~~~~~~·
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马