我目前正在研究 Java 安全性并遇到了一个奇怪的现象。java中的SecurityManager存储在java.lang.System的“security”字段中。有趣的是,该字段似乎受到保护以防止反射访问,这确实是有道理的,但据我所知,该字段是唯一的。所以这里是一个例子:
for(Field f : System.class.getDeclaredFields())
System.out.println(f);
输出
public static final java.io.InputStream java.lang.System.in
public static final java.io.PrintStream java.lang.System.out
public static final java.io.PrintStream java.lang.System.err
private static volatile java.io.Console java.lang.System.cons
private static java.util.Properties java.lang.System.props
private static java.lang.String java.lang.System.lineSeparator
有趣的是:该字段声明为
private static volatile SecurityManager security = null;
不在列表中,果然来电
System.class.getDeclaredField("security");
产生 NoSuchFieldException。因为我在网上找不到任何关于这个的信息,而且我很确定这个字段曾经可以通过反射访问(例如,参见 2010 年的这篇博客文章,它描述了访问这个字段)我想知道 a) 这个实现了吗作为防止通过反射轻松禁用安全管理器的快速修复和b)如何实现(或者更确切地说是否有任何机会保护其他私有字段免受反射)。