如何反映实现地图界面的字段?

时间:2013-05-09 19:00:03

标签: java reflection

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

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);

1 个答案:

答案 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,您可以使用上面的字段获取和设置。