如何以null为参数reflection调用方法?

我试图用Javareflection调用这个方法:

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

问题是我想将null作为null传递,因此foo变为null。

但是,在以下方法中,它假定没有参数,并且我得到IllegalArgumentExceptionwrong number of arguments ):

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

这是如何完成的?

尝试

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

对我来说,这不起作用:

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

但这有效:

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

编译器警告应该让你意识到这个问题;

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

你可以像这样解决它;

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

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

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

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

但是,如果您的方法具有单个Object[]参数,则始终必须将其包装。