反射时Java参数类型不匹配



我正在尝试运行一些方法,我从另一个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);

其中mModule。我不知道Module是什么,因此不知道getMainClass()返回什么。

如果使用不同的ClassLoader加载方法的类和参数的类,则可能发生此错误

您也可以尝试将其转换为整数。我也有同样的问题,我一直在拔头发。使用整数。parseInt成功了。我希望这对你有帮助。

下面是一个示例代码:
String num = "1";
int result = Integer.parseInt(num);         
System.out.println(result);

相关内容

  • 没有找到相关文章