36

Javaでこのメソッドを反射的に呼び出そうとしています:

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

null問題は、 foo が null になるようにnull を渡したいことです。

ただし、次のアプローチでは、引数がないことを前提としており、IllegalArgumentException( wrong number of arguments)を取得します。

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

これはどのように達成されますか?

4

4 に答える 4

72

試す

method.invoke(new FooHolder(), new Object[]{ null });
于 2012-04-10T11:38:31.513 に答える
8

私にとって、これは機能しません:

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

しかし、これは機能します:

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

于 2013-11-13T04:55:01.950 に答える
7

コンパイラの警告により、問題が認識されるはずです。

Method 型から varargs メソッド invoke(Object, Object...) を呼び出すには、null 型の引数を明示的に Object[] にキャストする必要があります。あるいは、varargs 呼び出しのために Object にキャストすることもできます。

このように修正できます。

Object arg = null;
method.invoke(new FooHolder(), arg);
于 2012-04-10T11:44:58.637 に答える
5

すでに投稿されているソリューションについて少し説明します。

Method.invoke()は可変アリティ関数として宣言されています。つまり、通常、オブジェクト配列を明示的に作成する必要はありません。オブジェクト配列自体として解釈される可能性のある単一のパラメーターを渡すためだけに、method.invoke( obj, null)失敗します。

たとえば、メソッドに 2 つのパラメーターがある場合、method.invoke( obj, null, null)完全に正常に機能します。

ただし、メソッドに単一のObject[]パラメーターがある場合は、常にラップする必要があります。

于 2012-04-10T11:45:42.550 に答える