Неверное число аргументов ошибка при вызове метода
у меня класс 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});
    }
}
