Java 非最终公共静态字段和非最终公共实例字段在安全性方面的区别?

Java 非最终公共静态字段和非最终公共实例字段在安全性方面的区别?,java,java-security,Java,Java Security,我正在浏览这个链接,上面说 客户端代码可以访问公共静态字段,因为 安全管理器不会检查这些字段的值 这到底是什么意思?i、 e从安全经理处逃跑是什么意思 如果他们的意思仅仅是因为字段是非最终的和公共的,那么为什么非最终的、公共的实例字段和静态的实例字段不同呢?(就代码安全而言) 我已经讨论过这个问题,没有看到任何关于安全的提及 public类的public static字段可以从任何地方访问,因此public实例字段也可以访问,那么区别在哪里呢?为什么非最终的公共的实例字段不是安全问题,而是静态的

我正在浏览这个链接,上面说

客户端代码可以访问公共静态字段,因为 安全管理器不会检查这些字段的值

这到底是什么意思?i、 e从安全经理处逃跑是什么意思

如果他们的意思仅仅是因为字段是非最终的和公共的,那么为什么非最终的、公共的实例字段和静态的实例字段不同呢?(就代码安全而言)

我已经讨论过这个问题,没有看到任何关于安全的提及


public
类的
public static
字段可以从任何地方访问,因此
public
实例字段也可以访问,那么区别在哪里呢?为什么非最终的
公共的
实例字段不是安全问题,而是静态的呢?

这是因为非静态字段的情况已经被

public
实例字段由OBJ01-J覆盖,原因稍有不同。首先,在更改公共实例字段之前,需要有对实例的引用,而公共静态字段可以在类级别直接访问。但两者都违反了证书规则

为什么非最终公共实例字段不是安全问题,而是静态的

如果要访问实例字段,则需要对该对象实例的引用。如果您没有参考资料,则无法访问它

因此,您的代码可以控制引用传递到哪些对象。如果恶意代码试图利用反射劫持您的一个对象以获取引用,您可以安装安全管理器来防止这种情况

另一方面,
publicstatic
字段可以从有权访问该类的每个人处访问,因为
class
对象是可访问的。因此,恶意代码可能只使用

YourClass.PUBLIC_INSTANCE_FIELD = someValue;
还是反思的方式

Class clazz = Class.forName("YourClass");
Field publicStaticField = clazz.getDeclaredField("PUBLIC_INSTANCE_FIELD");
publicStaticField.set(null, someValue);

所以这句话(公共实例字段转义安全管理器)也适用于这里,对吗?据我所知,
public
字段旨在从任何地方访问,禁用refelction等不会产生任何影响,或者无法在安全管理器中包含这些访问。@SabirKhan是的,安全管理器无法控制公共字段。您通常无法访问的非公共字段可以通过反射进行访问,但您可以使用SecurityManager禁用或控制通过反射进行的访问。因此,是否没有办法对
类对象
应用访问限制?最终,这也是一个对象,但没有保存在堆中,对吗?@SabirKhan我不知道“对类对象应用访问限制”是什么意思。您想保护主内存(RAM)不被劫持吗?我想问的是,您的示例中的类名
YourClass
java.lang.class
的实例吗?因此,如果
YourClass
只是一个类型为
java.lang.Class
的引用,那么我也可以对其应用安全管理器(如建议用于堆对象),或者安全管理器不能应用于jvm创建的
Class
对象?@sabirkan是,
YourClass
是类对象,我认为您也可以应用安全管理器。