【发布时间】:2019-12-25 19:29:06
【问题描述】:
我知道在编写 Java(或大多数)代码时使用访问修饰符是一种重要的做法,但是您可以使用反射绕过这些修饰符这一事实是否有效地使其变得多余?
例如,如果我想通过将对象敏感变量设置为私有并提供访问器方法来保护我的对象敏感变量,那么仍然有人可以轻松进入并使用反射绕过它,并可能设置不安全的值。为什么 Java 提供访问修饰符,然后提供绕过它们的工具?似乎两者都不使用会更容易。
【问题讨论】:
-
我还能闯进来,你为什么还要锁门?
-
你也可以配置一个SecurityManager来防止反射。
-
您会发现很多大型 Java 框架,例如 Hibernate 和 Jackson,在后台使用反射来分析您的对象并找出如何处理它们,而无需指定它们的行为详细的。如果你真的,真的想阻止反射访问你的对象的内部,你总是可以创建一个安全策略来阻止它。
-
访问修饰符主要防止人们意外地做他们不应该做的事情。你不能真正阻止一个坚定的“攻击者”故意做他们不应该做的事情。如果他们通过反射设置了一个值,并且库/框架/任何东西都没有按预期工作,那就很难了。
-
就像 Michael 解释的那样,让它变得更难确实是一个原因,但是您可以防止意外,并展示您打算如何让“谁”(类)和“哪里”使用您的代码(包)。
标签: java reflection access-modifiers