我试图通过反射获得以下字段的值:
Map<String,ClassLoader> loaders0 = new LinkedHashMap<String,ClassLoader>();
但是当我尝试使用field.get(new LinkedHashMap())
获取值时,我得到以下内容:
java.lang.IllegalArgumentException: Can not set java.util.Map field loaders0 to java.util.LinkedHashMap
和看到Map是一个接口,我不能做一个新的Map接口来设置它。有人知道怎么解决这个问题吗?
Field loadersField = this.getPluginLoader().getClass().getDeclaredField("loaders0");
toggleFinal(loadersField);
Map<String, PluginClassLoader> loaders0 = (Map<String, PluginClassLoader>) loadersField.get(new LinkedHashMap<String, PluginClassLoader>());
loaders0.put(description.getName(), bcl);
loadersField.set(Map.class,loaders0);
语句
loadersField.set(Map.class,loaders0);
表示您试图将对象Map.class
的字段loader
设置为值loaders0
。
你想要的是在你的类的一个实例上调用它,这个实例有字段loader
。
loadersField.set(yourInstance, loader0);
下面是这些方法的正确用法:
public class MyClass {
public Map<String, ClassLoader> loader = new LinkedHashMap<String, ClassLoader>();
public static void main(String[] args) {
try {
Field field = MyClass.class.getField("loader");
MyClass instance = new MyClass();
Map<String, ClassLoader> loader = (Map<String, ClassLoader>) field.get(instance);
System.out.println(loader.size()); // prints 0
Map<String, ClassLoader> newLoader = new LinkedHashMap<String, ClassLoader>();
newLoader.put("adsas", null);
field.set(instance, newLoader);
loader = (Map<String, ClassLoader>) field.get(instance);
System.out.println(loader.size()); // prints 1
} catch (Exception e) {
// do something
}
}
}
这个类有一个字段loader
,您可以使用上面的命令获取和设置。