2012-03-07 16 views
5

używam refleksji do wywołania metody na a class that is dynamically constructed at runtime:wywołanie metody poprzez odbicie, gdy argument jest typu Object []

public String createJDBCProvider(Object[] args) 

Oto jak:

Method m = adminTask.getClass().getMethod("createJDBCProvider", Object[].class); 
id = (String) m.invoke(adminTask, new Object[]{ "a", "b", "c" }); 

IDEA ostrzega mnie, że jestem winny redundant array creation for calling varargs method.

Metoda, którą sprawdzam, w rzeczywistości zajmuje Object[], a nie Object ..., ale prawdopodobnie są one równoważne i wymienne, więc myślę, że podążam naprzód.

W czasie wykonywania otrzymuję:

java.lang.IllegalArgumentException: wrong number of arguments 

Wydaje się więc, że, być może, mój Object[] jest przekazywana jako ciąg Object s. Czy to się dzieje? Jeśli tak, jak mogę go zmusić, aby tego nie robił?

+0

Co należy umieścić w miejscu "..." w rzeczywistym kodzie jest najbardziej istotną częścią. Czy mógłbyś pokazać, co jest w twoim prawdziwym kodzie? – dasblinkenlight

+0

Just strings. Zaktualizowano. – Synesso

+1

Varargs w Javie to po prostu cukier syntaktyczny. Kompilator zamienia 'Obiekt ...' na 'Obiekt []'. Więc tak, są one równoważne. –

Odpowiedz

5

Sposób, w jaki wywołujesz tę metodę, powoduje, że odbicie bierze pod uwagę trzy pojedyncze parametry, a nie pojedynczy parametr tablicy. Spróbuj tego:

id = (String) m.invoke(adminTask, new Object[]{ new Object[] {"a", "b", "c"} }); 
+0

Ack, myślałem o spróbowaniu tego, ale nie, ponieważ wydawało się to zbyt mało prawdopodobne. Dzięki. – Synesso

1

spróbuj tego:

Method m = adminTask.getClass().getMethod("createJDBCProvider", Object[].class); 
id = (String) m.invoke(adminTask, new String[]{ "a", "b", "c" }); 

Podpis metodzie invoke jest public Object invoke(Object obj, *Object... args*) i pomysł inspekcję, która wyzwala podczas przechodzenia tablicę, gdy oczekuje się vararg tego samego typu zamiast.

Powiązane problemy