调用方法时错误的参数数量错误

我有类AClass和方法someMethod获取Object数组作为参数。

 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); 

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

那没关系。

  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); 

注意invoke方法的第二个参数。 它是Object []本身,方法的参数类型也是Object []。

Method.invoke方法使对象接收方法调用以及方法的参数数组。 由于您的方法采用一个参数,因此给定的数组大小必须为1。

尝试创建一个大小为1的新数组:

 someMethod.invoke(anObject, new Object[] {parameters}); 

请注意,此数组中的一个值可以为null。 这将模拟anObject.someMethod(null)

扩大了orien和biaobiaoqi所说的话。 。 。

你在这里可能会让人困惑的是, Method.invoke(Object, Object...)通常可以只接受参数“inline”,可以这么说; 当编译器看到类似someMethod.invoke(someObject, arg1, arg2) ,它会隐式创建一个数组new Object[]{arg1, arg2} ,然后将该数组传递给Method.invoke 。 然后, Method.invoke将该数组的元素作为参数传递给您正在调用的方法。 到现在为止还挺好。

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

(这总是...符号的工作原理;它接受包含相应类型元素的数组, 或者接受适当类型的零个或多个参数。)

所以,正如orien和biaobiaoqi所说的那样,你需要将你的parameters换成一个额外的数组, new Object[] {parameters} ,这样parameters本身就会被传递到你的方法中。

那有意义吗?

invoke的参数是Object数组; 你的参数应该是一个包含你传递给someMethodObject[]Object[]

您不需要创建一个立即数组来执行此操作,因为invoke签名是invoke(Object, Object...) ,但在您的情况下,您尝试传入一个数组。 如果要传入null:

 Object[] parameters = { null }; ... someMethod.invoke(anObject, parameters); 

但最终,其他答案是正确的:您需要传入一个Object[]其中包含每个方法参数的条目。

尝试这个:

  someMethod.invoke(anObject, new .java.lang.Object[1][]{parameters}); 

我通过使用dp4j自动生成代码的Reflection API版本:

 $ javac -cp dp4j-1.2-jar-with-dependencies.jar -Averbose=true AClass.java AClass.java:10: Note: import com.dp4j.*; public class AClass { public AClass() { super(); } public void someMethod(Object[] parameters) { } @Reflect(all = true) public static void main(String... args) throws ... { Object[] parameters = null; ... AClass anObject; anObject = (.AClass)aClassConstructor.newInstance(); java.lang.reflect.Method someMethodWithArrayMethod = null; someMethodWithArrayMethod = Class.forName("AClass").getDeclaredMethod("someMethod", .java.lang.Object[].class); someMethodWithArrayMethod.setAccessible(true); someMethodWithArrayMethod.invoke(anObject, new .java.lang.Object[1][]{parameters}); } }