Подтвердить что ты не робот

Как я рефлексивно вызывать метод с нулевым аргументом?

Я пытаюсь вызвать этот метод в 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...

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

4b9b3361

Ответ 1

Попробуйте

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

Ответ 2

Передайте массив объектов, содержащий единственный null, или просто null, так как это varargs.

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

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

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