Ответ 1
Попробуйте
method.invoke(new FooHolder(), new Object[]{ null });
Я пытаюсь вызвать этот метод в Java рефлексивно:
public void setFoo(ArrayList<String> foo) { this.foo = foo; }
Проблема в том, что я хочу передать null как null
, так что foo становится null.
Однако в следующем подходе он предполагает, что аргументов нет, и я получаю IllegalArgumentException
(wrong number of arguments
):
method.invoke(new FooHolder(), null);
// -----------------------------^ - I want null to be passed to the method...
Как это достигается?
Попробуйте
method.invoke(new FooHolder(), new Object[]{ null });
Передайте массив объектов, содержащий единственный null, или просто null
, так как это varargs.
Предупреждение о компиляторе должно информировать вас о проблеме;
Аргумент типа null должен быть явно передан объекту [] для вызов метода varargs invoke (Object, Object...) из типа. В качестве альтернативы он может быть перенесен в Object для varargs Вызов
Вы можете исправить это следующим образом:
Object arg = null;
method.invoke(new FooHolder(), arg);
Для меня это НЕ работает:
m.invoke(c.newInstance(), новый объект [] {null});
НО это работает:
m.invoke(c.newInstance(), новый объект [] {});
Немного об объяснении уже опубликованных решений.
Method.invoke()
объявляется как функция переменной arity, и это означает, что обычно вам не нужно явно создавать массив объектов. Только потому, что вы передаете один параметр, который может быть интерпретирован как сам массив объектов, не выполняет method.invoke( obj, null)
.
Если, например, ваш метод имел два параметра, method.invoke( obj, null, null)
работал бы отлично.
Однако, если ваш метод имеет единственный параметр Object[]
, вы всегда должны его обернуть.