我正在尝试运行一些方法,我从另一个jar加载,返回一个整数,然后我想将它返回到另一个类并将其传递给我的逻辑。
我让我的方法加载类非常简单,像这样:
public class ModuleLoader {
private Class<?> cls;
public void initializeCommandModule(Module m) throws Exception {
URL url = this.getURL(m.getJar());
this.cls = this.loadClass(m.getMainClass(), url);
}
public int execute(Module m, ArrayList<String> args) throws Exception {
Method method = this.cls.getDeclaredMethod("execute", ArrayList.class);
return (int) method.invoke(this.cls.newInstance(), 1);
}
public int respond(ArrayList<String> args) throws Exception {
Method method = this.cls.getDeclaredMethod("response", ArrayList.class);
return (int) method.invoke(this.cls.newInstance(), 1);
}
private Class<?> loadClass(String cls, URL url) throws ClassNotFoundException, IOException {
URLClassLoader loader = new URLClassLoader(new URL[]{url});
Class<?> toReturn = loader.loadClass(cls);
loader.close();
return toReturn;
}
private URL getURL(String jar) throws MalformedURLException {
return new File(jar).toURI().toURL();
}
}
看一下execute(Module m, ArrayList<String> args)
方法,这一行抛出错误:
return (int) method.invoke(this.cls.newInstance());
我加载的jar库是这样的:
public class Test {
public int execute(ArrayList<String> i) {
System.out.println("Hello world!");
return 0;
}
}
为什么当我运行该方法时,我得到以下异常抛出?
Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at ben.console.modules.ModuleLoader.execute(ModuleLoader.java:24)
at ben.console.CommandProcessor.process(CommandProcessor.java:37)
at ben.console.Console.listen(Console.java:25)
at ben.console.Console.main(Console.java:31)
谢谢你的建议!
您忘记向方法调用传递参数了。
return (int) method.invoke(this.cls.newInstance(), myArrayList);
也可以用null参数调用:
return (int) method.invoke(this.cls.newInstance(), (Object[])null);
在你的execute()
方法中,你有这个
return (int) method.invoke(this.cls.newInstance());
我想你想要
return (int) method.invoke(this, args);
与respond()
类似,
Method method = this.cls.getDeclaredMethod("response", ArrayList.class);
return (int) method.invoke(this.cls.newInstance(), 1);
应该return (int) method.invoke(this, args);
你可能会发现我的博客在这里有帮助
据我所知,您的获取方法接受ArrayList
类型的一个参数:
Method method = this.cls.getDeclaredMethod("execute", ArrayList.class);
然后用我无法识别的参数类型调用它显然不是ArrayList
(int) method.invoke(this.cls.newInstance());
this.cls.newInstance()
的类型是什么?cls
的值在initializeCommandModule()
方法中按如下方式赋值:
。cls = this.loadClass(m.t getmainclass (), url);
其中m
为Module
。我不知道Module
是什么,因此不知道getMainClass()
返回什么。
如果使用不同的ClassLoader
加载方法的类和参数的类,则可能发生此错误
您也可以尝试将其转换为整数。我也有同样的问题,我一直在拔头发。使用整数。parseInt成功了。我希望这对你有帮助。
下面是一个示例代码:String num = "1";
int result = Integer.parseInt(num);
System.out.println(result);