我正在尝试找到一种方法,通过 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/