1

我有 .jar 文件,调用Plugin.jar它包含一个类,plugin.Plugin,方法public ArrayList<String> getList()

我试图从我的主程序中调用该方法,这是一个完全不同的 NetBeans 项目。

但是,我在子句java.lang.IllegalArgumentException: object is not an instance of declaring class之前的最后一行得到一个。catch

主程序(getList()在另一个 .jar 中调用的程序)如下所示:

public class PluginMain {

    public static void main(String[] args) {
        try {
            File file = new File("plugins/Plugin.jar");
            URL url = file.toURI().toURL();
            URL[] urls = new URL[]{url};
            ClassLoader cl = new URLClassLoader(urls);

            Class cls = cl.loadClass("plugin.Plugin");
            Method method = cls.getDeclaredMethod("getList");
            ArrayList<String> invoke = (ArrayList<String>) method.invoke(cls);
        } catch (MalformedURLException | ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
            Logger.getLogger(PluginMain.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

来自的plugin.PluginPlugin.jar看起来像这样:

public class Plugin {

    public Plugin() {
    }

    public ArrayList<String> getList(){
        ArrayList<String> list = new ArrayList();
        list.add("String1");
        list.add("String2");
        list.add("String3");
        return list;
    }
}

这是我第一次尝试这样的事情,我真的迷失了,我应该做些什么来解决这个异常。任何帮助将不胜感激。

4

1 回答 1

3

Method#invoke(Object, Object...)方法需要该方法所属的类的实例。

你有一些反思的选择。如果你的类有一个无参数构造函数(就像它一样),你可以使用

Object instance = cls.newInstance();

然后通过

ArrayList<String> invoke = (ArrayList<String>) method.invoke(instance);

如果您的类没有无参数构造函数,则需要从可用的构造函数中进行选择

Constructor[] constructors = cls.getConstructors();

我试图从我的主程序中调用该方法,这是一个完全不同的 NetBeans 项目。

请注意,只要类文件在类路径上,您就可以这样做

Plugin plugin = new Plugin();
...

它位于不同项目中的事实与您运行程序的方式无关java

于 2013-09-30T20:21:03.487 回答