我试图通过反射得到以下字段的值:
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);
答案 0 :(得分:1)
本声明
loadersField.set(Map.class,loaders0);
表示您尝试将对象loader
的字段Map.class
设置为值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
,您可以使用上面的字段获取和设置。