我知道有很多关于反思的问题。我已经阅读过他们中的每一个,但我的问题的答案并没有出现。
这里我有以下代码
Method fn = Class.forName("paramopt.ParamOpt")
.getDeclaredMethod("Fn", double[].class);
方法fn(double[] x)
是在ParamOpt
类上声明为public static
的函数。它以这种方式调用
y[n] = (double) fn.invoke(new Object[]{start});
其中start
是double
数组。还有我得到的地方
IllegalArgumentException
:错误数量的参数消息。
有什么想法吗?
答案 0 :(得分:2)
public Object invoke(Object obj, Object... args) { ... }
您没有向invoke
方法传递任何参数。
第一个参数负责调用此方法的实例。由于该方法为static
,因此您应该在那里传递null
。
下一个参数是 varargs 参数,它显示实际的方法参数。在这里你使用双阵列。
答案是:
fn.invoke(null, new Object[]{start});
或只是
fn.invoke(null, start);
根据the javadocs,IllegalArgumentException
被抛出
如果方法是实例方法,并且指定的对象参数不是声明底层方法(或其子类或实现者)的类或接口的实例;如果实际参数和形式参数的数量不同;如果原始参数的展开转换失败;或者,如果在可能的解包后,参数值无法通过方法调用转换转换为相应的形式参数类型。
此外,"15.12.4.4 Locate Method to Invoke"可能会有所帮助。