如何反思调用与null作为参数的方法?(How do I reflectively invoke a

2019-07-28 21:45发布

我想反思调用Java中此方法:

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

问题是,我想传递null作为null ,这样foo将变成零。

然而,在下面的方法它假定没有参数,我也得到IllegalArgumentExceptionwrong number of arguments ):

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

这是如何实现的呢?

Answer 1:

尝试

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


Answer 2:

对我来说,这并不工作:

m.invoke(c.newInstance(),新的对象[] {NULL});

但这种工作原理:

m.invoke(c.newInstance(),新的对象[] {});



Answer 3:

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

型空的参数应该明确地转换为对象[]从类型法可变参数方法调用(对象,对象...)的调用。 它可以替代性地转换为对象的可变参数调用

您可以修复它像这样;

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


Answer 4:

的解释,以解决方案的位已经发布。

Method.invoke()声明为可变参数数量的功能,这意味着您平时并不需要显式地创建一个对象数组。 只因为你传递一个参数,这可以解释为一个对象数组本身并method.invoke( obj, null)失败。

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

但是,如果你的方法有一个Object[]参数,你总是把它包起来。



文章来源: How do I reflectively invoke a method with null as argument?