2012-04-10 14 views
22

nullを引数として反射的にメソッドを呼び出すにはどうすればよいですか?私は反射的Javaでこのメソッドを呼び出すようにしようとしています

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

問題は、私はnullとしてnullを渡したいということなので、そのfooがnullになります。

ただし、次のようなアプローチでは、引数がないことを前提としていた、と私はIllegalArgumentExceptionwrong number of arguments)を取得:

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

これが達成される方法は?

+2

「varargs」が悪くなる場合。 – biziclop

答えて

51

は、コンパイラの警告は、問題のあなたを認識させる必要があります

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

をお試しください。

型ヌルの引数が明示的 種類メソッドから可変引数メソッド呼び出し(オブジェクト、オブジェクト...)の[] の呼び出しをオブジェクトにキャストされなければなりません。代わりに、varargsのためにオブジェクトにキャストすることもできます 呼び出し

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

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

すでに投稿されたソリューションの説明のビット。

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

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

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

6

私にとって、これは動作しない:

m.invoke(c.newInstance()は、新しいオブジェクト[] {NULL})。

しかし、これは動作します。

m.invoke(c.newInstance()、新しいオブジェクト[] {})。

+2

それから引数のないメソッドがあるかもしれません –

関連する問題