Я изучал исходный код java.util.HashMap
и хотел посмотреть, насколько хорошо хеш-код распределяет ключи во внутреннем массиве Entry
(, который представляет собой пакетзакрытая переменная ). Поэтому я сделал пакет с именем 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
илиЕсть ли другая альтернатива (, возможно, с использованием отражения )?