java - 如何从另一个 .jar 中的类调用方法?

标签 java methods jar

我有 .jar 文件,名为 Plugin.jar其中包含一个类,plugin.Plugin , 使用方法 public ArrayList<String> getList() .

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

但是,我得到一个 java.lang.IllegalArgumentException: object is not an instance of declaring classcatch 之前的最后一行条款。

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

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.Plugin来自 Plugin.jar 的类(class)看起来像这样:

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

这是我第一次尝试这样的事情,我真的很迷茫,不知道应该怎么做才能修复异常。任何帮助将不胜感激。

最佳答案

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

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

Object instance = cls.newInstance();

然后传递给它

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

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

Constructor[] constructors = cls.getConstructors();

I am trying to call that method from my main program, which is a completely different NetBeans project.

请注意,只要类文件在类路径上,您就可以做很多事情

Plugin plugin = new Plugin();
...

它在不同项目中的事实与您如何运行 java 程序无关。

关于java - 如何从另一个 .jar 中的类调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19103085/

相关文章:

java - 如何在 list 文件中设置类路径,同时从 Eclipse 创建 JAR?

java - 用户定义的资源文件夹位于包含的 jar 中,与 android res 文件夹相同,以生成新的 R.java 类

java - ObjectOutputStream 方法 : writeBytes(String str) vs writeUTF(String s);

java - 如何在空 ArrayList 中测试元素类型的类?

java - 如何在 Java 中对 HashMap 进行排序

java - 获取定义的值并在 Java 字符串方法中使用它们

java - 用于在 android 中读取 SRT 文件的正则表达式

swift - 下标使用方法的额外优势是什么

ios - 等待 block 完成返回 token nsstring

java - 如何在 Unity 中设置 Java 应用程序名称?