黑马程序员技术交流社区
标题:
反射问题
[打印本页]
作者:
山水游客
时间:
2012-7-25 15:18
标题:
反射问题
反射中getDeclaredField(变量名)方法和setAccessible(ture)方法可以强行取出对象中的私有变量,
那把属性设为private还有什么用呢?
作者:
周玉龙
时间:
2012-7-25 15:45
反射中getDeclaredField(变量名)方法和setAccessible(ture)方法可以强行取出对象中的私有变量,
getDedaredField Method 获得被阻止的文件访问权。
setAccessible(true) method是设置字段是友好的,这样就可以将私有字段打印在控制台了。
将属性设置为私有的是为了防止一般用户去访问这些字段,但是作为开发者我们可以通过反射去访问。
将内部的属性和方法进行封装的一个方法就是私有,然后向用户提供接口,用户通过提供的接口进行操作。
为什么叫强行取出来了? 就像你身上的私有的钱包,被飞车贼强行抢走了。就会产生不良的影响。
这个也是一样的。 不要过多的使用暴力反射,容易产生问题。
作者:
李菁
时间:
2012-7-25 20:37
反射中用getMethod()调用类方法,但如果方法为私有的,会发生NoSuchMethodException异常。因为getMethod()调用公共方法,不能反射调用私有方法。
所以用getDeclaredField()方法,能访问本类中定义的所有方法,包括private修饰的方法
setAccessible(true)是用来设置是否有权限访问反射类中的私有属性的,只有设置为true时才可以访问,默认是false。
作者:
吴立杰
时间:
2012-7-25 21:09
楼主首先要明确暴力反射的用途:暴力反射是在后期你的程序需要推展功能的时候,你对外提供一个接口,后期推展功能的开发者只需实现你这个接口去推展他自己的功能,而你只需要在你的程序内部用反射获取这个开发者的类即可,但他必须按照你给他的属性文件填写相关内容,例如:类名,方法名等。所以暴力访问是有前提的,如果你不知道它们的名字和参数列表,不知道那些字段的名字,你要怎么访问?
还有解释下类中成员属性私有的模式为专家模式,你要搞一个类,这个类拥有什么属性内容你不想让除了本类的任何类知道,那么你就私有。
楼主仔细看看张孝祥老师的基础加强课程,那里面反射讲的很清晰了,一点小建议,忘采纳。加油!
作者:
高欢欢
时间:
2012-7-26 10:28
属性设置为private 是符合OOP的思想 利用暴力反射去获取毕竟是特别情况 我们有时候可以忽略这种情况 按照人们的正常思维去思考
举例子: 你的钱 在你的口袋的 如果不设置private 就是希望别人直接伸手去你的口袋里获取钱
暴力反射就是 类似有一个小偷在你不知道的情况下获取到了你的钱 (属于例外)
就好像 静态 static 他其实就是全局对象 不属于OOP思想里的 但是它存在 我们也用他
其实一个真正有经验的人不会去在乎什么什么标准什么什么模式 怎么做有效率 人家就会怎样做
比如数据库设计 一定要符合三大范式 但是人家有经验的人 发现如果不符合三大范式 那会使数据库更优化 效率更好 那么人家不一定会去遵守三大范式
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2