Reflection 什么';如果你可以通过反射改变私有属性,那么拥有私有属性有什么用呢?

Reflection 什么';如果你可以通过反射改变私有属性,那么拥有私有属性有什么用呢?,reflection,Reflection,我知道这听起来像一个愚蠢的问题,但是如果你可以访问私有属性并更改它们,那么你的API有多安全?没错,它不是完全安全的,但是反射也非常有用。但您仍然只能在属性具有setter的情况下设置属性,因此它并不都是“坏的”。至少在.NET中,您可以使用 此外,类和类成员中可见性级别的目的不仅仅是访问安全性。它也是一种组织和记录代码的方法:当您看到私有成员时,您知道它不打算在类外使用,虽然您可以通过反射使用它,但通常不会这样做,因为它可能会在应用程序中导致意外行为 不管怎样,我发现这个问题有点像“如果我能用

我知道这听起来像一个愚蠢的问题,但是如果你可以访问私有属性并更改它们,那么你的API有多安全?

没错,它不是完全安全的,但是反射也非常有用。但您仍然只能在属性具有setter的情况下设置属性,因此它并不都是“坏的”。

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

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


不管怎样,我发现这个问题有点像“如果我能用足够大的锤子砸碎门,那么门上有锁有什么用?”:-)

尽管反射确实非常有用,但它被认为是一种改变属性的间接方法,而不是一种必须得到API认可或支持的方法


话虽如此,通过设置私有属性,可以确保使用不支持反射的语言通过正常方式访问它的人不会更改它。通过直接内存访问,始终有可能绕过API


封装不是为了保护您的API不被滥用,而是为了隐藏代码中可能发生更改的部分。如果客户机代码使用官方界面,那么在这样的更改之后,它将继续工作。如果不是的话,那就是这段代码的作者刚刚射中了他的脚。

当人们可以把门踢开时,在你的门上加锁有什么意义?使用反射需要更多的技能和更多的努力。在大多数情况下,代码都很好。无论如何,反射在非完全信任环境中也不能很好地工作。

使用私有属性时,使用反射与不使用反射是一样的,但是如果考虑使用反射来访问第三方类中的私有成员,他应该非常清楚自己在做什么,而且他肯定知道这会破坏可操作性。

你可以通过安装一个。因此,如果您需要它,您可以真正将其私有化(并为此付出代价:一些第三方库将不再工作)


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

令人惊讶的是,我们两人都想出了同样的现实例子:-)不管是谁决定把门踢开,他都知道他们不应该这么做。。。