如果可以通过反射绕过访问修饰符,那么访问修饰符的目的是什么?

What is the purpose of access modifiers if they can be bypassed with reflection?

我知道在编写 Java(或大多数)代码时使用访问修饰符是一种重要的做法,但是您可以使用反射绕过这些修饰符这一事实是否有效地使它变得多余?

例如,如果我想通过将它们设置为私有并提供访问方法来保护我的对象敏感变量,有人仍然可以轻松地进入并使用反射绕过它,并可能设置不安全的值。为什么 Java 提供访问修饰符,然后提供绕过它们的工具?似乎两者都不使用会更容易。

我认为修饰符的优点是你可以更快地知道如何使用 file/library。没有反射就不能访问 private fields/methods。

对于您想要防止攻击者使用反射的情况,JVM 具有一种安全机制,允许您通过 Java 安全策略文件定义对代码的限制。除非您另有指定,否则它将使用默认值。

运行 您的应用程序使用了 SecurityManager 和足够严格的安全策略,可以找到策略 here

您可能会发现本教程很有用:http://docs.oracle.com/javase/tutorial/essential/environment/security.html

访问修饰符的一个重要用途是构建代码并帮助该代码的用户有效且正确地理解和使用它。这不同于用作防篡改安全机制。因此,同时拥有访问修饰符和反射并不矛盾。代码的编写者可以使用访问修饰符表达他们的意图,而需要绕过它们的代码,无论出于何种原因,都可以在通常的风险和影响下这样做。