调用方法时参数数错误

我有一个类和一个方法,它获取数组作为参数。AClasssomeMethodObject

public class AClass {
    public void someMethod(Object[] parameters) {
    }
}

在 main 中,当我尝试在我创建的对象上调用此方法并将对象数组作为此方法的参数时

Object[] parameters; // lets say this object array is null
Class class = Class.forName("AClass");
Object anObject = class.newInstance();

Method someMethod = class.getDeclaredMethod("someMethod", parameters.getClass());
someMethod.invoke(anObject, parameters);

我得到“错误的参数数量错误”。我错过了什么?


答案 1

那就没问题了。

Object[] parameters = {new Object()}; // lets say this object array is null
Class clas = Class.forName("AClass");
Object anObject = clas.newInstance();

Object[] param = {parameters};

Method someMethod = clas.getDeclaredMethod("someMethod", parameters.getClass());
someMethod.invoke(anObject, param);

请注意调用方法的第二个参数。它本身就是,你的方法的参数类型也是。Object[]Object[]


答案 2

为了扩展一下orien和biaobiaoqi在说什么......

在这里可能让你感到困惑的是,可以这么说,通常可以“内联”参数;当编译器看到类似的东西时,它会隐式创建一个数组,然后将该数组传递给 。 然后将该数组的元素作为参数传递给您正在调用的方法。目前为止,一切都好。Method.invoke(Object, Object...)someMethod.invoke(someObject, arg1, arg2)new Object[]{arg1, arg2}Method.invokeMethod.invoke

但是当编译器看到类似的东西时,它假设你已经将参数打包到一个数组中;所以它不会再次重新包装它们。因此,将尝试将 作为参数的元素传递给您正在调用的方法,而不是将自身作为参数传递。someMethod.invoke(someObject, someArray)Method.invokesomeArraysomeArray

(这始终是表示法的工作方式;它接受包含适当类型元素的数组,或者接受零个或多个适当类型的参数。...

因此,正如orien和biaobiaoqi所说,您需要将您重新包装到一个额外的数组中,以便它本身最终被传递到您的方法中。parametersnew Object[] {parameters}parameters

这有意义吗?