How do I reflectively invoke a method with null as

2020-05-19 22:02发布

I am trying to invoke this method in Java reflectively:

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

The problem is that I want to pass null as null, so that foo becomes null.

However, in the following approach it assumes that there are no arguments, and I get IllegalArgumentException(wrong number of arguments):

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

How is this accomplished?

4条回答
你好瞎i
2楼-- · 2020-05-19 22:19

The compiler warning should make you aware of the problem;

The argument of type null should explicitly be cast to Object[] for the invocation of the varargs method invoke(Object, Object...) from type Method. It could alternatively be cast to Object for a varargs invocation

You can fix it like this;

Object arg = null;
method.invoke(new FooHolder(), arg);
查看更多
太酷不给撩
3楼-- · 2020-05-19 22:23

Try

method.invoke(new FooHolder(), new Object[]{ null });
查看更多
该账号已被封号
4楼-- · 2020-05-19 22:32

For me, this DOES NOT work:

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

BUT this works:

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

查看更多
Juvenile、少年°
5楼-- · 2020-05-19 22:34

A bit of an explanation to the solutions already posted.

Method.invoke() is declared as a variable arity function, and that means that normally you don't need to explicitly create an object array. Only because you pass a single parameter, which could be interpreted as an object array itself, does method.invoke( obj, null) fail.

If for example your method had two parameters, method.invoke( obj, null, null) would work perfectly fine.

However if your method has a single Object[] parameter, you always have to wrap it.

查看更多
登录 后发表回答