黑马程序员技术交流社区

标题: 反射技术是不是破坏了java的封装性 [打印本页]

作者: 王玉玺    时间: 2011-9-24 10:31
标题: 反射技术是不是破坏了java的封装性
我们知道java是面向对象的编程语言
有很好的封装性
访问私有成员需要通过getter setter方法
反射技术可以直接访问私有成员
是不是破坏了这种封装性
作者: 黄锋    时间: 2011-9-24 10:38
面向对象只是一种思想罢了,属性的私有化隐藏属性的可见性,其实也是种设计理念.属性访问器的作用,只是起到一种加工的作用,在获取或者设置属性值的时候可以添加一些判断货或者加工,例如值的范围判断,编码修改等等.
反射这东西主要用在框架的开发上面,和一些设计模式也会用到.如果反射连私有属性都破解不了,你现在看到的SSH都不存在了.框架就是大量使用了反射技术的.
[ 本帖最后由 黄锋 于 2011-09-24  10:40 编辑 ]
作者: 匿名    时间: 2011-9-24 10:44
楼上说的对,封装和反射并不冲突
作者: 丁朋伟    时间: 2011-9-24 10:46
这个问题也想过,当时的结论是
封装,是将具体的实现细节隐藏,而把功能作为整体提供给类的外部使用,也就是说,公有方法能够完成类所具有的功能。当别人使用这个类时,如果通过反射直接调用私有方法,可能根本实现不了类的功能,甚至可能会出错,因此通过反射调用私有方法可以说是没有任何用处的,开发人员没有必要故意去破坏封装好的类。从这点上看,封装性并没有被破坏。
[ 本帖最后由 丁朋伟 于 2011-09-24  10:48 编辑 ]
作者: 匿名    时间: 2011-9-24 16:14
我觉得是对封装的一种补充吧
作者: 匿名    时间: 2011-9-24 19:36
[quote] 原帖由 [i]丁朋伟[/i] 于 2011-09-24 10:46 发表 [url=http://bbs.itheima.com/redirect.jsp?goto=findpost&pid=10781&ptid=1705][img]http://bbs.itheima.com/images/common/back.gif[/img][/url]这个问题也想过,当时的结论是
封装,是将具体的实现细节隐藏,而把功能作为整体提供给类的外部使用,也就是说,公有方法能够完成类所具有的功能。当别人使用这个类时,如果通过反射直接调用私有方法,可能根本实现不了类的功能,甚至可能会出错,因此通过反射调用私有方法可以说是没有任何用处的,开发人员没有必要故意去破坏封装好的类。从这点上看,封装性并没有被破坏。 [/quote]

不太明白你说的逻辑,"如果通过反射直接调用私有方法,可能根本实现不了类的功能,甚至可能会出错,因此通过反射调用私有方法可以说是没有任何用处的,开发人员没有必要故意去破坏封装好的类。从这点上看,封装性并没有被破坏。"这有什么因果关系吗?

感觉你解释的逻辑不清楚啊?还是我理解不到位???

请指教
作者: 匿名    时间: 2011-9-24 21:16
如果定义了一个类,这个类中有四个方法
private  String A(String string)(return "xxx"),
private  String B(String string)(return "xxx"),
private  String C(String string)(return "xxx"),
private  String D(String i ,String j,String k)(return "xxx"),
ABC这三个方法去服务D,外界只要调用D并且给D相应的参数
在用反射的确是能获得这几个方法,并能传递参数接受返回值,那么拿到ABC的返回值又有什么用呢?
毕竟在反射中不能了解i ,j, k.使用A,B,C中的那个方法去处理的。这对这个类的封装没影响吧
作者: 匿名    时间: 2011-9-26 18:50
封装性是指对外隐藏对象的属性和实现细节,仅对外提供公共的访问方式。反射是通过对象找到类,既然找到类了,那么我们就可以得到这个类的成员结构了,例如这个类的属性和方法,即使是private的也能得到,你想,现在这个类我都得到了,那么这个类中的所以东西我肯定是都得到了,我现在只是得到了这个类的成员,并没有说是在外部访问这个类的private的东西。这并没有破坏面向对象的封装性。
作者: 匿名    时间: 2011-9-27 10:16
The key to making encapsulation work is to have methods [color=Red]never directly access[/color] instance
fields in a class other than their own. Programs should interact with object data [color=Red]only[/color]
through the object’s methods.
从这个描述上,我认为反射破坏封装这句话是错误的,因为封装他的概念是其他类的[color=Red]不能直接访问[/color]封装类的实例域,程序之间的交互仅仅通过对象的方法,那么反射其实就是通过对象的方法来完成访问实例域的,并没有直接访问实例域。
Encapsulation is the way to give the object its “black box”
behavior, which is the key to [color=Red]reuse[/color] and reliability.
这说明他的封装的目的并不是让别人无法访问,而是让封装的类有更好的可重用性和可靠性。
作者: 匿名    时间: 2011-9-27 17:40
前些天我在ITeye上看到过有人讨论这个问题,当时争的好像还挺凶的,各种各样的例子啊,想法啊,模式啊,我看的挺头大,有兴趣的哥们可以去ITeye搜索一下,
作者: 匿名    时间: 2011-9-27 22:17
如果你一定要用破坏,可以这样讲:反射能够破坏程序的封装性




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