繁体   English   中英

如何以 null 作为参数以反射方式调用方法?

[英]How do I reflectively invoke a method with null as argument?

我试图反射性地调用 Java 中的这个方法:

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

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

但是,在以下方法中,它假定没有 arguments,并且我得到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 调用可变参数方法 invoke(Object, Object...)。 它也可以转换为 Object 以进行可变参数调用

你可以这样修复它;

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

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

Method.invoke()声明为变量 arity function,这意味着通常您不需要显式创建 object 数组。 仅仅因为你传递了一个参数,它可以被解释为一个 object 数组本身,所以 method.invoke method.invoke( obj, null)失败了。

例如,如果您的方法有两个参数, method.invoke( obj, null, null)将工作得很好。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM