如何以null为参数reflection调用方法?
我试图用Javareflection调用这个方法:
public void setFoo(ArrayList 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 });
对我来说,这不起作用:
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[]
参数,则始终必须将其包装。