首页 > 解决方案 > 为什么在调用调用方法(JAVA)时出现“错误数量的参数”异常

问题描述

我正在尝试在 java 中调用具有反射的方法,但是当我调用调用方法时出现异常。这是我的代码:

public void start() {
    try {   
        ServerSocket server = new ServerSocket(port);

        while(true) {
            Socket s = server.accept();

            ObjectInputStream in = new ObjectInputStream(s.getInputStream());

            Class<?> myClass = Class.forName(vmi.getClass().toString().split(" ")[1]);          

            ArrayList<Object> array = new ArrayList();

            Constructor<?> cons = myClass.getConstructor(new Class<?>[] {});    


            String method = null;
            for(Method m : myClass.getMethods()) {
                method = in.readObject().toString();

                if(m.getName().equals(method)) {

                    Type return_type = m.getGenericReturnType();

                    for(Type types: m.getGenericParameterTypes()) {
                        array.add(in.readObject());
                    }
                    System.out.println(return_type);
                    if (return_type.toString().equals("void")) {                            
                         m.invoke(vmi, (Object)array);
                    }                       
                    break;
                }
            }   

        }
    } catch (IOException | ClassNotFoundException | NoSuchMethodException 
            | SecurityException | IllegalAccessException 
            | IllegalArgumentException | InvocationTargetException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();

        System.out.println("Skeleton Exception "+ e.toString());
    }
}

这是一个例外:

java.lang.IllegalArgumentException:参数数量错误

我也尝试用空对象调用该方法,异常继续

m.invoke(vmi, new Object(), new Object());

顺便说一句,变量vmiport是在构造函数中初始化的。

标签: java

解决方案


Method.invoke方法的签名是:

public Object invoke(Object obj, Object... args)

这是语法糖(如果你没有传递可变参数):

public Object invoke(Object obj, Object[] args)

但是,您传递(Object,Object)-> this 会将第二个对象作为可变参数的单个参数,因此编译器会将您的调用转换为m.invoke(vmi, new Object[] { array }).

使您的代码复杂化的事实是您有一个名为 的变量array,但它的类型实际上是ArrayList,它不是数组。

您可以将代码更改为:

m.invoke(vmi, array.toArray());

这会将您的参数作为整个 varargs 参数args而不是作为 varargs 数组中的单个元素传递。


推荐阅读