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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王玉玺 黑马帝   /  2011-9-24 10:31  /  7233 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我们知道java是面向对象的编程语言
有很好的封装性
访问私有成员需要通过getter setter方法
反射技术可以直接访问私有成员
是不是破坏了这种封装性

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 值得讨论!

查看全部评分

12 个回复

倒序浏览
面向对象只是一种思想罢了,属性的私有化隐藏属性的可见性,其实也是种设计理念.属性访问器的作用,只是起到一种加工的作用,在获取或者设置属性值的时候可以添加一些判断货或者加工,例如值的范围判断,编码修改等等.
反射这东西主要用在框架的开发上面,和一些设计模式也会用到.如果反射连私有属性都破解不了,你现在看到的SSH都不存在了.框架就是大量使用了反射技术的.
[ 本帖最后由 黄锋 于 2011-09-24  10:40 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-24 10:44:44
藤椅
楼上说的对,封装和反射并不冲突
回复 使用道具 举报
这个问题也想过,当时的结论是
封装,是将具体的实现细节隐藏,而把功能作为整体提供给类的外部使用,也就是说,公有方法能够完成类所具有的功能。当别人使用这个类时,如果通过反射直接调用私有方法,可能根本实现不了类的功能,甚至可能会出错,因此通过反射调用私有方法可以说是没有任何用处的,开发人员没有必要故意去破坏封装好的类。从这点上看,封装性并没有被破坏。
[ 本帖最后由 丁朋伟 于 2011-09-24  10:48 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 有道理,赞同!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-24 16:14:22
报纸
我觉得是对封装的一种补充吧
回复 使用道具 举报
黑马网友  发表于 2011-9-24 19:36:57
地板
[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]

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

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

请指教

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-24 21:16:22
7#
如果定义了一个类,这个类中有四个方法
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中的那个方法去处理的。这对这个类的封装没影响吧

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-26 18:50:29
8#
封装性是指对外隐藏对象的属性和实现细节,仅对外提供公共的访问方式。反射是通过对象找到类,既然找到类了,那么我们就可以得到这个类的成员结构了,例如这个类的属性和方法,即使是private的也能得到,你想,现在这个类我都得到了,那么这个类中的所以东西我肯定是都得到了,我现在只是得到了这个类的成员,并没有说是在外部访问这个类的private的东西。这并没有破坏面向对象的封装性。
回复 使用道具 举报
黑马网友  发表于 2011-9-27 10:16:34
9#
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.
这说明他的封装的目的并不是让别人无法访问,而是让封装的类有更好的可重用性和可靠性。

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-27 17:40:42
10#
前些天我在ITeye上看到过有人讨论这个问题,当时争的好像还挺凶的,各种各样的例子啊,想法啊,模式啊,我看的挺头大,有兴趣的哥们可以去ITeye搜索一下,
回复 使用道具 举报
黑马网友  发表于 2011-9-27 22:17:42
11#
如果你一定要用破坏,可以这样讲:反射能够破坏程序的封装性
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马