36

我正在尝试在 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...

这是如何实现的?

4

4 回答 4

72

尝试

method.invoke(new FooHolder(), new Object[]{ null });
于 2012-04-10T11:38:31.513 回答
8

对我来说,这不起作用:

m.invoke ( c.newInstance() , new Object[] { null } );

但这有效:

m.invoke ( c.newInstance() , new Object[] { } );

于 2013-11-13T04:55:01.950 回答
7

编译器警告应该让您意识到问题;

应将 null 类型的参数显式转换为 Object[],以便从 Method 类型调用可变参数方法 invoke(Object, Object...)。也可以将其转换为 Object 以进行 varargs 调用

你可以这样修复它;

Object arg = null;
method.invoke(new FooHolder(), arg);
于 2012-04-10T11:44:58.637 回答
5

对已经发布的解决方案的一些解释。

Method.invoke()被声明为变量 arity 函数,这意味着通常您不需要显式创建对象数组。只是因为您传递了一个可以解释为对象数组本身的参数,才会method.invoke( obj, null)失败。

例如,如果您的方法有两个参数,则method.invoke( obj, null, null)可以正常工作。

但是,如果您的方法只有一个Object[]参数,您总是必须包装它。

于 2012-04-10T11:45:42.550 回答