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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 山水游客 中级黑马   /  2012-7-25 15:18  /  1353 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

反射中getDeclaredField(变量名)方法和setAccessible(ture)方法可以强行取出对象中的私有变量,
那把属性设为private还有什么用呢?

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
反射中getDeclaredField(变量名)方法和setAccessible(ture)方法可以强行取出对象中的私有变量,
getDedaredField Method 获得被阻止的文件访问权。
setAccessible(true) method是设置字段是友好的,这样就可以将私有字段打印在控制台了。
将属性设置为私有的是为了防止一般用户去访问这些字段,但是作为开发者我们可以通过反射去访问。
将内部的属性和方法进行封装的一个方法就是私有,然后向用户提供接口,用户通过提供的接口进行操作。
为什么叫强行取出来了? 就像你身上的私有的钱包,被飞车贼强行抢走了。就会产生不良的影响。
这个也是一样的。  不要过多的使用暴力反射,容易产生问题。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
反射中用getMethod()调用类方法,但如果方法为私有的,会发生NoSuchMethodException异常。因为getMethod()调用公共方法,不能反射调用私有方法。
所以用getDeclaredField()方法,能访问本类中定义的所有方法,包括private修饰的方法

setAccessible(true)是用来设置是否有权限访问反射类中的私有属性的,只有设置为true时才可以访问,默认是false。
回复 使用道具 举报
楼主首先要明确暴力反射的用途:暴力反射是在后期你的程序需要推展功能的时候,你对外提供一个接口,后期推展功能的开发者只需实现你这个接口去推展他自己的功能,而你只需要在你的程序内部用反射获取这个开发者的类即可,但他必须按照你给他的属性文件填写相关内容,例如:类名,方法名等。所以暴力访问是有前提的,如果你不知道它们的名字和参数列表,不知道那些字段的名字,你要怎么访问?
还有解释下类中成员属性私有的模式为专家模式,你要搞一个类,这个类拥有什么属性内容你不想让除了本类的任何类知道,那么你就私有。
楼主仔细看看张孝祥老师的基础加强课程,那里面反射讲的很清晰了,一点小建议,忘采纳。加油!

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
属性设置为private  是符合OOP的思想  利用暴力反射去获取毕竟是特别情况 我们有时候可以忽略这种情况 按照人们的正常思维去思考
举例子: 你的钱 在你的口袋的 如果不设置private 就是希望别人直接伸手去你的口袋里获取钱
暴力反射就是 类似有一个小偷在你不知道的情况下获取到了你的钱  (属于例外)
就好像 静态 static 他其实就是全局对象 不属于OOP思想里的 但是它存在 我们也用他
其实一个真正有经验的人不会去在乎什么什么标准什么什么模式 怎么做有效率 人家就会怎样做
  比如数据库设计  一定要符合三大范式 但是人家有经验的人 发现如果不符合三大范式 那会使数据库更优化 效率更好 那么人家不一定会去遵守三大范式
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马