invoke throws IllegalArgumentException:参数个数错误

时间:2017-08-15 17:27:45

标签: java reflection

我知道有很多关于反思的问题。我已经阅读过他们中的每一个,但我的问题的答案并没有出现。

这里我有以下代码

Method fn = Class.forName("paramopt.ParamOpt")
                 .getDeclaredMethod("Fn", double[].class);

方法fn(double[] x)是在ParamOpt类上声明为public static的函数。它以这种方式调用

 y[n] = (double) fn.invoke(new Object[]{start});

其中startdouble数组。还有我得到的地方

  

IllegalArgumentException:错误数量的参数消息。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

您没有向invoke方法传递任何参数。

第一个参数负责调用此方法的实例。由于该方法为static,因此您应该在那里传递null

下一个参数是 varargs 参数,它显示实际的方法参数。在这里你使用双阵列。

答案是:

fn.invoke(null, new Object[]{start});

或只是

fn.invoke(null, start);

根据the javadocsIllegalArgumentException被抛出

  

如果方法是实例方法,并且指定的对象参数不是声明底层方法(或其子类或实现者)的类或接口的实例;如果实际参数和形式参数的数量不同;如果原始参数的展开转换失败;或者,如果在可能的解包后,参数值无法通过方法调用转换转换为相应的形式参数类型。

此外,"15.12.4.4 Locate Method to Invoke"可能会有所帮助。