java - 使用反射在java中获取静态私有(private)hashmap

标签 java reflection hashmap

我正在尝试找到一种方法,通过 Java 从另一个类中的私有(private)静态字段中提取 HashMap。

例如。

在 FooClass 内部有一个如下所示的静态字段:

private Map entityRenderMap;

然后在它的构造中它有:

entityRenderMap = new HashMap();

在 Java 中如何通过反射获取 entityRenderMap 中的值?我试过这个但出现错误:

cl = RenderManager.class.getDeclaredField("entityRenderMap");
        cl.setAccessible(true);
        Object foo = cl.get(this.entityRenderMap);
        Mod.log(cl.getName());

我得到的错误是:

java.lang.IllegalArgumentException: Can not set java.util.Map field RenderManager.entityRenderMap to java.util.HashMap
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(Unknown Source)
at sun.reflect.UnsafeObjectFieldAccessorImpl.get(Unknown Source

最佳答案

首先,您的代码与您的解释不符。它真的是一个静态字段还是不是(您的代码说它不是)?

如果它是静态的,您应该将 null 作为参数传递给 cl.get()(您不需要实例来访问静态成员)。

但是,我怀疑您的字段实际上不是静态的,并且您将错误的实例传递给 cl.get()。 JavaDocs Field.get()说明在这种情况下它会抛出一个 IllegalArgumentException。您需要将 RenderManager 实例传递给此方法。您的代码看起来像传递一个 Map(entityRenderMap)。

最后,这段代码是否在您的 RenderManager 类中?我怀疑这一点,因为您使用 this 访问与您要设置的字段同名的字段。在这种情况下,根本不要使用反射!

关于java - 使用反射在java中获取静态私有(private)hashmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8960301/

相关文章:

java - 如何使用 Reflection API 正确泛化返回实例的方法?

java - 如何删除 Android HashMap 中的大括号

python - 将 Ruby 哈希字符串转换为 Python 字典

Java堆栈溢出错误-图算法

Java - TreeMap 不检索键

java - Jacoco 代码覆盖率受 AspectJ 影响

java - HQL:使用 ManyToMany 进行 Hibernate 查询

reflection - 为什么 Rebol 3 不尊重括号中的引用函数参数?

java - 如何在java中使用math.pi

c# - 使用可能不存在的反射设置属性