如果您可以使用反射改变私有属性,有什么用?

时间:2009-11-18 10:43:11

标签: reflection

我知道这听起来像个愚蠢的问题,但是如果您可以访问私有媒体资源并更改它们,您的API有多安全?

7 个答案:

答案 0 :(得分:10)

当人们可以将门打开时,锁上门有什么意义?使用反射需要更多技能和更多努力。在大多数情况下,代码很好。无论如何,反射在非完全信任环境中效果不佳。

答案 1 :(得分:6)

在不支持反射的语言中,总是有可能通过直接内存访问来绕过API。

封装不是为了保护您的API免受滥用,而是隐藏可能发生变化的代码部分。如果客户端代码使用官方界面 - 在这样的更改后它将继续工作。如果没有,那么这个代码的作者只是拍了拍他的脚。

答案 2 :(得分:4)

嗯,至少在.NET中,您可以使用disallow reflection

.NET permissions.

此外,类和类成员中可见性级别的目的不仅是访问安全性。它也是一种组织和记录代码的方法:当你看到一个私人成员时,你知道它不打算在课外使用,虽然也许你可以通过反射使用它,你通常不会这样做可能会在您的应用程序中导致意外行为。

无论如何,我发现这个问题有点像“如果我能用足够大的锤子粉碎它们,那么门锁的目的是什么?” : - )

答案 3 :(得分:1)

这是对的,它不是完全安全的,但反射也非常有用。但是你仍然只能设置一个属性,如果它有一个setter,所以它并非都是“坏”。

答案 4 :(得分:1)

尽管反射非常有用,但它被认为是一种改变属性的间接方法,而不是一种应该由API认可或支持的方法。

话虽如此,通过设置私有财产,确保那些通过正常方式

访问它的人不会改变它

答案 5 :(得分:1)

使用私有属性与没有它的反射相同,但如果考虑使用反射来访问第三方类中的私有成员,他应该非常肯定知道他做了什么 - 而且他肯定知道这可以打破可操作性。

答案 6 :(得分:1)

您可以通过安装SecurityManager来阻止访问私有媒体资源。因此,如果您需要它,您可以真正使其成为私有(并付出代价:某些第三方库将不再起作用)。

与法律一样,private是价格标签。他们说“如果你不遵守我所施加的规则,就要付出代价。”这并不意味着你必须遵守规则(就像禁止杀人一样不会阻止谋杀)。