反射打破了封装原则。我们可以保护封装原则不被反射吗?是否有任何 API 可以保护封装免受反射?
2 回答
从技术上讲,是的。对 SO 的快速搜索给出了一个防止反射的示例:https ://stackoverflow.com/a/770672/2372767 。不过话说,
反射打破了封装原则......
意味着对原理的误解。封装的重点不是保护您的代码免受恶意其他代码的侵害,或保护您的实现,甚至创建某种级别的安全性。
当您使用公共和私有方法创建接口(类、模块、对象等)时,实际上是在创建两个接口:一个易于使用,另一个不易于使用。本质上,当您将某事设为私有时,您真正想说的是“这是完成某事的混乱、复杂细节的一部分,直接调用它可能很危险。”
我要强调的一点是:你的私有接口仍然是一个接口,应该像对待你的公共方法一样小心对待。虽然您永远不应该鼓励其他程序员使用私有成员,但您不知道其他人何时需要使用其中一个混乱、复杂的步骤。
正如其他用户所提到的,还有其他方法可以获得私人班级成员。反射是一个易于使用的 API 来完成相同的任务。
在封装的许多定义中都这样说A language mechanism for restricting access to some of the object's components.
您在设计应用程序时使用此机制。无论如何,它从来都不是保护应用程序的任务。因此,您可能不会将此概念用作安全机制,并且您肯定不会声称 Reflection 会阻止它。只有开发人员可以通过留下未封装的东西来阻止反射。