我的.jar文件名为Plugin.jar
,其中包含一个类plugin.Plugin
,其方法为public ArrayList<String> getList()
。
我试图从我的主程序中调用该方法,这是一个完全不同的NetBeans项目。
但是,我在java.lang.IllegalArgumentException: object is not an instance of declaring class
子句之前的最后一行得到catch
。
主程序(在另一个.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
类如下所示:
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;
}
}
这是我第一次尝试这样的事情而且我真的迷失了,我应该怎样做才能解决这个异常。任何帮助将不胜感激。
答案 0 :(得分:3)
Method#invoke(Object, Object...)
方法需要该方法所属的类的实例。
你有一些反思选择。如果你的类有一个no-args构造函数(就像它一样),你可以使用
Object instance = cls.newInstance();
然后传递
ArrayList<String> invoke = (ArrayList<String>) method.invoke(instance);
如果你的类没有no-args构造函数,你需要从可用的构造函数中选择
Constructor[] constructors = cls.getConstructors();
我试图从我的主程序中调用该方法,这是一个 完全不同的NetBeans项目。
请注意,只要类文件位于类路径上,您就可以执行
Plugin plugin = new Plugin();
...
它在一个不同的项目中与你运行java
程序的方式无关。