我正在研究源代码java.util.HashMap http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Core/Collections-Jar-Zip-Logging-regex/java/util/HashMap.java.htm我想看看 hashcode 函数在内部数组中分布键的效果如何Entry
's(这是一个包私有变量).所以我做了一个名为java.util
在我的项目中只是为了检查天气,我可以欺骗编译器认为它是同一个包。令人惊讶的是它有效,我编写了以下代码:
package java.util;
public class HashMapExt<K, V> extends HashMap<K, V> implements Map<K, V> {
public static void main(String[] args) {
HashMapExt<Integer, String> mp = new HashMapExt<Integer, String>();
mp.put(1, "Hello");
mp.put(2, "Map");
mp.put(3, "Extention");
mp.printData();
}
void printData() {
System.out.println(Arrays.toString(table));
}
}
编译成功,但运行时出现异常:
Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.util
at java.lang.ClassLoader.preDefineClass(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
现在的问题是,是否可以更改默认的安全模型,以便我可以访问内部变量table
或者还有其他选择吗(也许通过使用反射) ?
即使可以选择让您的班级在java.util
包(例如替换核心 jar 或定义自定义类加载器),您最好使用反射。它简单明了:
Field tableField = HashMap.class.getDeclaredField("table");
tableField.setAccessible(true);
Map.Entry[] entries = (Map.Entry[]) tableField.get(yourMap);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)