Java 使用保留包名访问包专用变量

Java 使用保留包名访问包专用变量,java,access-modifiers,Java,Access Modifiers,我正在研究的源代码,我想看看hashcode函数在条目的内部数组中分配密钥的效果如何(这是一个包私有变量).因此,我在我的项目中制作了一个名为java.util的包,只是为了检查我是否可以愚弄编译器,使其认为它是同一个包。令人惊讶的是,它成功了,我编写了以下代码: package java.util; public class HashMapExt<K, V> extends HashMap<K, V> implements Map<K, V> {

我正在研究的源代码,我想看看hashcode函数在
条目的内部数组中分配密钥的效果如何(这是一个包私有变量).因此,我在我的项目中制作了一个名为
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));
    }
}

现在的问题是,是否可以更改默认的安全模型,以便我可以访问内部变量
,或者是否有其他替代方法(可能通过使用反射)?

您可以尝试在类路径中预加jar,或者通过使用认可的目录

前者:

java -Xbootclasspath/p:youJarHere.jar  ..... 
其效果是,首先加载jar中的类,甚至覆盖核心类

后一种形式是将class/jar放在
$JAVA_HOME/lib/annowned
目录中,它具有类似的效果

我已经有几年没有使用过这些了,但我曾经用它们来替换一个核心类(CORBA包中的某个类或类似的东西)

试试看,让我们知道它是否有效

以下是一些链接:


即使在
java.util
包中有一个让类的选项(比如替换核心jar或定义自定义类加载器),也最好使用反射。它简单明了:

Field tableField = HashMap.class.getDeclaredField("table");
tableField.setAccessible(true);
Map.Entry[] entries = (Map.Entry[]) tableField.get(yourMap);

这有点令人困惑。什么是认可的目录?链接:认可的标准覆盖机制提供了一种方法,可以将实现认可标准或独立技术的类和接口的更高版本合并到Java平台中。但是,
java.util
似乎不适合这种机制。我会更新答案
Field tableField = HashMap.class.getDeclaredField("table");
tableField.setAccessible(true);
Map.Entry[] entries = (Map.Entry[]) tableField.get(yourMap);