如何限制变量不要在java中的类外访问?

时间:2011-12-23 17:52:07

标签: java

我正在使用java。我知道使用私有访问修饰符我们可以限制。但是使用 Reflection API 仍然可以访问类外的变量。那么私有修饰符在这里有什么用?

4 个答案:

答案 0 :(得分:8)

private阻止您使用Java从其他类访问它。但是,使用JNI或库可以做不同的事情。您可以使用安全管理器阻止反射,但这很少需要。

注意:像Serialization这样的库需要能够访问私有字段才能工作。

答案 1 :(得分:2)

因为反射破坏了封装。如果应用程序在安全托管环境中运行,则可以阻止使用反射API。见Java Security Manager

答案 2 :(得分:1)

  

然后在这里使用私人修饰符是什么

private修饰符不是安全机制;它是(一部分)封装机制。隐藏对象的内部公共消费有助于使对象保持一致,可用的状态,同时提供关于对象的哪些部分组成公共接口的评论(并且可以依赖于不改变)。

当然,用户可以使用反射来访问private字段中的数据,但他们知道他们正在做一些不受库支持的事情。

答案 3 :(得分:0)

我不是Java安全性方面的专家,但我认为你必须提供自己的SecurityManager并覆盖checkMemberAccess()。例如,防止所有反射

   public void checkMemberAccess(Class<?> clazz, int which) throws AccessControlException {

      if (which != Member.PUBLIC) {
          throw new AccessControlException("No reflection on non-public fields allowed");
      }
   }

显然,在现实世界中,您可能想要在第一个参数中仅检查“重要”类的某个子集。并且,正如许多其他回复中所述,这将导致许多第三方库出现问题。