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

时间:2011-11-18 22:11:10

标签: java reflection illegalargumentexception

我有一个类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);

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

5 个答案:

答案 0 :(得分:23)

那没关系。

    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 []。

答案 1 :(得分:9)

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

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

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

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

答案 2 :(得分:9)

扩大orien和biaobiaoqi所说的话。 。

这里可能令你感到困惑的是,Method.invoke(Object, Object...)通常只能将参数“内联”,可以这么说;当编译器看到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本身最终被传递到你的方法中。 / p>

这有意义吗?

答案 3 :(得分:4)

invoke的参数是Object的数组;您的参数应为Object[] ,其中包含Object[]传递给someMethod

由于invoke签名为invoke(Object, Object...),您不需要创建一个立即数组,但在您的情况下,您尝试传入数组。如果你想传入null:

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

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

答案 4 :(得分:1)

试试这个:

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