1

I'm trying to get the value of the following field via reflection:

Map<String,ClassLoader> loaders0 = new LinkedHashMap<String,ClassLoader>();

but when I try to get the value using field.get(new LinkedHashMap()), I get the following:

java.lang.IllegalArgumentException: Can not set java.util.Map field loaders0 to java.util.LinkedHashMap

and seeing as Map is an interface I could not make a new Map interface to set it too. Does anybody know how to get around this?

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

1 回答 1

2

这个说法

loadersField.set(Map.class,loaders0);

表示您正在尝试将loader对象Map.class的字段设置为 value loaders0

您想要的是在具有字段的 Class 实例上调用它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
        }
    }
}

这个类有一个 field loader,你可以用上面的方法获取和设置它。

于 2013-05-09T19:13:50.700 回答