java - 反射可以改变对象的状态吗?

标签 java oop reflection

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

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

作者在其中描述了如何通过反射改变对象字段的值。他解释了即使该字段具有私有(private)访问权限也该怎么做。

前一段时间,我读了 Joshua Block 的书:“Effective Java”。在那里,他说,为了防止对对象的字段、方法等的不安全访问,只要有可能,我们应该为字段和方法赋予最严格的修饰符(即尽可能私有(private),如果它是对象的一部分,则为公共(public)或 protected )暴露的 api)。

我的问题如下:

如果无论如何都可以通过反射访问敏感信息,为什么还要费心将类设计为不公开敏感信息?

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

最佳答案

一方面,“私有(private)”并不意味着安全功能。参见 this similar question . Java 有一个安全系统,如果您真的想要那种保护,您应该使用它。

OOP 中的“私有(private)”是意图的信号,是您类(class)契约的一部分。通过将字段标记为“私有(private)”,您是在声明如果有人潜入并通过反射或其他方式修改内容,那么您在类其余部分所做的所有保证都不再有效。

这有点像电视或其他设备保修中的细则 - 如果您开始在布线内部四处挖掘(可以这么说,私有(private)领域),则保修无效,三星或任何人都赢了支付修理您在那里时可能搞砸的任何东西的费用。

关于java - 反射可以改变对象的状态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38578079/

相关文章:

java - 从文件中读取成绩

java - 致命异常 : main ; OOP ; RuntimeException in JAVA

.net - 非 IDisposable 接口(interface)的 IDisposable 实现

java - 使用java搜索JSon字符串

java - Android java 从额外意图获取 ArrayList<byte[]>

java - 在 Java 中的方法之间使用相同的对象实例

c# - 将 PropertyInfo 转换为通用类型

reflection - Go:我怎样才能 "unpack"一个结构?

java - 有没有办法检查一个类是否有一个方法,然后在该对象的一个​​已经存在的实例上调用它?

java - 无法在 Java 中使用 DataOutputStream 写入整数