2012-04-10 10 views
22

Sto cercando di richiamare questo metodo in Java riflessivo:Come faccio a richiamare in modo riflessivo un metodo con null come argomento?

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

Il problema è che voglio passare null come null, in modo che foo diventa nulla.

Tuttavia, il seguente approccio che presuppone che non ci sono argomenti, e ottengo IllegalArgumentException (wrong number of arguments):

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

Come si realizza?

+2

Quando 'varargs' diventa cattivo. – biziclop

risposta

51

Prova

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

L'avviso del compilatore dovrebbe rendere consapevoli del problema;

L'argomento di tipo nullo dovrebbe esplicitamente gettato a Object [] per l'invocazione del metodo varargs invoke (Object, Object ...) da tipo Method. In alternativa, può essere lanciato su Oggetto per vararga invocazione

È possibile risolvere il problema in questo modo;

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

Un po 'di spiegazione delle soluzioni già pubblicate.

Method.invoke() è dichiarato come funzione di arità variabile e ciò significa che in genere non è necessario creare un array di oggetti in modo esplicito. Solo perché si passa un singolo parametro, che potrebbe essere interpretato come un array di oggetti stesso, non riesce method.invoke(obj, null).

Se ad esempio il metodo avesse due parametri, method.invoke(obj, null, null) funzionerebbe perfettamente.

Tuttavia, se il metodo ha un singolo parametro Object[], è sempre necessario completarlo.

6

Per me, questo non funziona:

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

MA questo funziona:

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

+2

Allora forse hai un metodo senza argomenti –

Problemi correlati