【问题标题】:Can reflection change the state of an object?反射可以改变对象的状态吗?
【发布时间】:2016-07-25 21:59:38
【问题描述】:

我阅读了以下有关 Java 反射的文章:

https://community.oracle.com/docs/DOC-983192

在其中,作者描述了如何通过反射来改变对象字段的值。他解释了如何做到这一点,即使该字段具有私有访问权限。

我在回来的时候读了 Joshua Block 的书:“Effective Java”。在那里,他说,为了防止对对象的字段、方法等的不安全访问,只要有可能,我们应该给字段和方法提供最严格的修饰符(即,尽可能私有、公共或受保护,如果它是暴露的api)。

我的问题如下:

如果无论如何都可以通过反射访问敏感信息,为什么还要设计你的类以不暴露敏感信息?

(实际上,我是在询问我缺少的信息来理解这个主题)

【问题讨论】:

  • 将字段标记为私有或受保护对于让您的库或 API 的用户知道他们应该如何使用(或不使用)该字段大有帮助。这不仅仅是安全问题。
  • 私有化就像在电源插座上盖上绝缘盖:它向人们表明您希望他们如何使用它;但这并不能阻止有人拧开前面并触摸火线。
  • 也可以使用 SecurityManager 来防止反射修改。见stackoverflow.com/questions/7566626/…

标签: java oop reflection


【解决方案1】:

一方面,“私人”并不意味着作为一种安全功能。见this similar question。 Java 有一个安全系统,如果你真的想要这种保护,你应该使用它。

OOP 中的'private' 是意图的信号,并且是您班级合同的一部分。通过将字段标记为“私有”,您表示如果有人潜入并使用反射或其他东西修改内容,那么您在课堂其余部分所做的所有保证都不再有效。

这有点像电视或其他设备保修中的细则 - 如果您开始在接线内部(可以说是私人领域)挖掘,那么保修无效,三星或任何赢得保修的人不承担修理你在那里可能搞砸的任何东西的费用。

【讨论】:

    猜你喜欢
    • 2014-03-21
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多