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