Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反射是否打破了私有方法的概念,因为私有方法可以在类之外访问?_C#_Java_Php_Reflection_Junit - Fatal编程技术网

C# 反射是否打破了私有方法的概念,因为私有方法可以在类之外访问?

C# 反射是否打破了私有方法的概念,因为私有方法可以在类之外访问?,c#,java,php,reflection,junit,C#,Java,Php,Reflection,Junit,反射是否打破了私有方法的概念?因为私有方法可以从类外部访问?(也许我不明白反思的意义,或者错过了什么,请告诉我) 编辑: 如果relection打破了私有方法的概念,我们是否只为程序逻辑而不为程序安全使用私有方法 谢谢我认为这是一个意见问题,但是如果您使用反射来绕过开发人员在类上设置的封装,那么您就无法达到目的 因此,为了回答您的问题,它打破了封装(或信息隐藏)的概念,即私有属性/方法是私有的,因此它们不能在类外处理。是的,反射打破了这一概念。本地语言也有一些打破OOP规则的技巧,例如,在C+

反射是否打破了私有方法的概念?因为私有方法可以从类外部访问?(也许我不明白反思的意义,或者错过了什么,请告诉我)

编辑: 如果relection打破了私有方法的概念,我们是否只为程序逻辑而不为程序安全使用私有方法


谢谢

我认为这是一个意见问题,但是如果您使用反射来绕过开发人员在类上设置的封装,那么您就无法达到目的


因此,为了回答您的问题,它打破了封装(或信息隐藏)的概念,即私有属性/方法是私有的,因此它们不能在类外处理。

是的,反射打破了这一概念。本地语言也有一些打破OOP规则的技巧,例如,在C++中,可以使用指针技巧来更改私有类成员。然而,通过使用这些技巧,我们得到的代码可能与将来的类版本不兼容——这是我们为违反OOP规则而付出的代价。

是的。反射破坏了封装原理。这不仅可以访问私有成员,还可以公开类的整个结构。

是的,反射可以用来破坏封装,甚至导致错误行为。请记住,程序集需要被信任来执行反射,因此仍然存在一些保护。

反射确实提供了一种绕过Java访问保护修饰符的方法,因此<>强>违反了C++和java java实现的严格封装<强>。然而,这并不像你想象的那么重要

访问保护修改器旨在帮助程序员开发模块化的、功能完善的系统,而不是不妥协的把关人。有时有很好的理由打破严格的封装,例如和框架开发

虽然一开始可能很难接受访问保护修饰符很容易绕过的想法,但请记住,有许多语言(,等等)根本没有访问保护修饰符。这些语言用于构建大型复杂系统,就像提供访问保护的语言一样


关于访问保护修饰符是帮助还是阻碍存在一些争论。即使您重视访问保护,也要将其视为帮助之手,而不是项目的成败。

它就像您的房子一样。锁只会让诚实的人,或是不愿意撬开你锁的人呆在外面

数据就是数据,如果有人有足够的决心,他们可以用你的代码做任何事情。随便什么


是的,反射将允许人们用代码做你不希望他们做的事情,例如访问私有字段和方法。然而,重要的是人们不会意外地这样做。如果他们使用反射,他们知道他们在做一些他们可能不打算做的事情,就像没有人意外地撬开你前门上的锁一样。

是的,如果你愿意,它会破坏封装。然而,它可以很好地使用——比如为私有方法编写单元测试,或者有时——正如我从自己的经验中所学到的那样——绕过第三方API中的bug:)


请注意,封装!=安全封装是一个面向对象的设计概念,仅用于改进设计。就安全性而言,java中有一种安全机制。

正如其他人已经说过的那样


但是,我记得在Java中,可以有一个活动的安全管理器,它可以阻止您访问任何私有方法,即使您没有权限访问反射。如果运行本地JVM,这样的管理器通常不处于活动状态。

反射使任何CLR类都可以检查和操作其他CLR类的属性和字段,但不一定要明智地这样做。一个类可以通过让属性和字段以不明显的方式相互依赖、静态字段、底层操作系统信息等来模糊属性和字段的含义,或者保护它们不被篡改

例如,类可以在某个变量中为其主窗口保留操作系统句柄的加密版本。通过使用反射,另一个类可以看到该变量,但在不知道加密方法的情况下,它无法识别它所属的窗口或使该变量引用另一个窗口


我见过声称充当“通用序列化器”的类;如果将它们应用于数据存储容器类之类缺少“可序列化”属性但在其他方面非常简单的对象,则它们可能非常有用。如果将它们应用于任何一个其创建者试图模糊事物的类,它们将产生gobbledygook。

是的,但这不是一个问题

封装不是关于安全或秘密,只是关于组织事情

反射不是“正常”编程的一部分。如果您想使用它来破坏封装,那么您可以接受风险(版本控制问题等)

只有在没有更好(侵入性更小)的方法来完成某件事情时,才应该使用反射

反射用于系统级的“工具”,如持久性映射,应该隐藏在经过良好测试的库中。我会发现在普通应用程序代码中使用反射是可疑的


我从“这不是问题”开始。我的意思是:只要你按照预期使用反射。小心。

是的,它确实破坏了封装。但在某些情况下使用它有很多很好的理由

例如:

我在一些网站上使用,但它会在标签周围呈现一个
,这会弄乱我的HTML。然后我可以使用标准的标记并使用反射来获取验证码的值