Java 我们能保护封装原理不被反射破坏吗?

Java 我们能保护封装原理不被反射破坏吗?,java,Java,反射破坏了封装原理。 我们能保护封装原理不被反射吗?是否有任何API可以保护封装不受反射?在许多封装定义中,有一种称为的语言机制,用于限制对某些对象组件的访问。您在设计应用程序时使用这种机制。无论如何,保护应用程序从来都不是It的任务。因此,您可能不会将此概念用作安全机制,也肯定不会声称反射阻止了它。只有开发人员可以通过保留未封装的内容来阻止反射 从技术上讲,是的。对SO的快速搜索提供了一个防止反射的示例:。不管怎么说, 反射破坏了封装原理 这意味着对原则的误解。封装的目的不是保护您的代码免受其

反射破坏了封装原理。
我们能保护封装原理不被反射吗?是否有任何API可以保护封装不受反射?

在许多封装定义中,有一种称为
的语言机制,用于限制对某些对象组件的访问。
您在设计应用程序时使用这种机制。无论如何,保护应用程序从来都不是It的任务。因此,您可能不会将此概念用作安全机制,也肯定不会声称反射阻止了它。只有开发人员可以通过保留未封装的内容来阻止反射

从技术上讲,是的。对SO的快速搜索提供了一个防止反射的示例:。不管怎么说,

反射破坏了封装原理

这意味着对原则的误解。封装的目的不是保护您的代码免受其他恶意代码的攻击,也不是保护您的实现,甚至不是创建某种级别的安全性

当您使用公共和私有方法创建接口(类、模块、对象等)时,实际上您创建了两个接口:一个易于使用,另一个不易于使用。本质上,当你把某件事情保密时,你真正要说的是“这是完成某件事情的混乱、复杂细节的一部分,直接打电话给它可能是危险的。”

我想强调的一点是:您的私有接口仍然是一个接口,应该像对待公共方法一样谨慎对待。虽然您不应该鼓励其他程序员使用私有成员,但您不知道其他人何时需要使用这些混乱、复杂的步骤之一


正如其他用户所提到的,还有其他方法可以获得私有类成员。反射是一种易于使用的API,用于完成相同的任务。

我认为您需要将其改写为更具体的内容,可能需要一个示例。“封装原则”太宽泛和笼统了。你在寻找模糊处理……只有在真正需要的时候才应该这样做……在大多数情况下不是……关于这个主题,这里有一个SO:你的意思是禁止
setAccessible()
?请看,您可能可以使用自定义安全管理器禁用反射。如果您(例如)在类中有一个公共字段,并说“破坏封装”,则有些人会陷入困境。“封装原则”充其量是定义不清的(尽管有很多“权威机构”声称知道它的含义)。@HotLicks IMO,这只会在公共领域暴露某些内部状态时破坏封装。实际上,公共字段和简单的getter&setter(尽管后一种模式更容易维护)之间没有太大区别,但是反射暴露了内部状态。而且(我认为这与最初的意图相反)反射经常被用来愚弄非“公共”的状态;它不会破坏消息“此接口使用起来很危险”。另一半是你无法最终控制其他人对你的代码做什么,你只能指导他们使用它的最佳方式。我认为这与最初的意图相反,private通常被用作临时工作台,而不是作为公共接口进行维护。OTOH,如果每个Tom、Dick和Henry都使用反射来处理“封装”类的内部,而这些类确实“破坏了封装”--这与公开内部成员没有什么不同。反思是一种可憎的东西,尽管是必要的。@HotLicks,“枪不会杀人,人会杀人”。如果使用得当,反射是一件好事。就像原子能一样,你可以制造核武器或发电厂。你可以认为这是一个令人憎恶的问题,但在我看来,这确实是一件好事,可以让你扩大你的应用程序模块化。除了增加一层低效的混淆之外,反射与公开所有内容有何不同?你的问题将一个问题与另一个问题进行比较。从逻辑上讲,没有一个好的答案。所有东西都公开无疑会使一个非琐碎的系统很难维护。基本原则是,任何公开的东西都可能被其他人使用。另一方面,当您使用反射进入类内部并更改范围时,您将冒着后果的风险。如果你认为反射是一种用来阅读隐藏事物的工具,那么你就没有正确地使用它。Thant是的。除了反射被非常常规地使用,而且它不容易区分公共数据和私人数据。