2012-04-10 2 views
22

Я пытаюсь вызвать этот метод в Java рефлекторно:Как отразить вызов метода с нулевым аргументом?

public void setFoo(ArrayList<String> foo) { this.foo = foo; } 

Проблема заключается в том, что я хочу передать нуль, как null, так что Foo становится нулевой.

Однако, в следующем подходе предполагается, что нет никаких аргументов, и я получаю IllegalArgumentException (wrong number of arguments):

method.invoke(new FooHolder(), null); 
// -----------------------------^ - I want null to be passed to the method... 

Как это достигается?

+2

Когда 'varargs' превращается плохо. – biziclop

ответ

51

Попробуйте

method.invoke(new FooHolder(), new Object[]{ null }); 
6

Предупреждение компилятора должно сделать вас в курсе проблемы;

Аргумент типа нуля должен явно быть приведен к Object [] для призывания метода Invoke (переменных аргументов Object, Object ...) из метода типа. В качестве альтернативы он может быть передан объекту для варгаров вызов

Вы можете исправить это следующим образом;

Object arg = null; 
method.invoke(new FooHolder(), arg); 
3

Немного пояснения к уже опубликованным решениям.

Method.invoke() объявлен как функция переменной arity, и это означает, что обычно вам не нужно явно создавать массив объектов. Только потому, что вы передаете один параметр, который может быть интерпретирован как сам массив объектов, делает method.invoke(obj, null) сбой.

Если, например, ваш метод имел два параметра, method.invoke(obj, null, null) работал бы отлично.

Однако, если ваш метод имеет один параметр Object[], его всегда нужно обернуть.

6

Для меня это не работает:

m.invoke (c.newInstance(), новый объект [] {NULL});

НО это работает:

m.invoke (c.newInstance(), новый объект [] {});

+2

Тогда, возможно, у вас есть метод без аргументов –

Смежные вопросы