如何反射实现映射接口的字段



我试图通过反射获得以下字段的值:

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,您可以使用上面的命令获取和设置。

最新更新