Неверное число аргументов ошибка при вызове метода

у меня класс 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 ответов


все будет в порядке.

    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. Это сам объект [], и тип аргумента вашего метода также является объектом [].


Метод.метод invoke принимает объект для получения вызова метода и массива аргументов метода. Поскольку ваш метод принимает один аргумент, данный массив должен иметь размер одного.

попробуйте создать новый массив с размером 1:

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

обратите внимание, что одно значение в этом массиве может быть null. Это будет имитировать anObject.someMethod(null)


чтобы немного расширить то, что говорят Ориен и 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 постараюсь передать элементов of someArray в качестве аргументов метода вашего вызова, а не передачи someArray в качестве аргумента.

(это всегда как ... нотация работает; она принимает или массив, содержащий элементы соответствующего типа, или ноль или более аргументы соответствующего типа.)

Итак, как сказали Ориен и biaobiaoqi, вам нужно перемотать свой parameters в дополнительный массив, new Object[] {parameters}, так что parameters сам заканчивается тем, что передается в ваш метод.

это имеет смысл?


параметры invoke массив Object; ваши параметры должны быть Object[] содержащих the Object[] вы переходите к someMethod.

вам не нужно создавать немедленный массив для этого, так как invoke подпись invoke(Object, Object...), но в вашем случае вы пытаетесь передать в пустой массив. Если вы хотите передать значение null:

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

в конечном счете, однако, другие ответы верны: вам нужно пройти в Object[] содержит запись для каждый из параметров методами.


попробуйте это:

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

Я получил, автоматически генерируя версию API отражения вашего кода с dp4j:

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