2012-03-07 16 views
5

estoy usando la reflexión para llamar a un método en a class that is dynamically constructed at runtime:método de llamada a través de la reflexión, cuando el argumento es de tipo Object []

public String createJDBCProvider(Object[] args) 

Así es como:

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

idea me advierte que estoy culpable de redundant array creation for calling varargs method.

El método que estoy llamando en realidad toma un Object[], no Object ..., pero probablemente sean equivalentes e intercambiables, creo, así que sigo adelante.

En tiempo de ejecución me sale:

java.lang.IllegalArgumentException: wrong number of arguments 

por lo que parece que, tal vez, mi Object[] se está pasando como una secuencia de Object s. ¿Esto es lo que está pasando? Si es así, ¿cómo puedo obligarlo a que no lo haga?

+0

¿Qué pones en lugar del '...' en el código real es la parte más relevante. ¿Podría mostrar qué hay en su código real? – dasblinkenlight

+0

Solo cuerdas. Actualizado. – Synesso

+1

Varargs en Java es solo azúcar sintáctico. El compilador convierte 'Objeto ...' en 'Objeto []'. Entonces sí, son equivalentes. –

Respuesta

5

La forma en que llama al método, la reflexión cree que está pasando tres parámetros individuales, en lugar de un solo parámetro de matriz. Prueba esto:

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

Ack, pensé en probar esto pero no lo hice porque parecía muy poco probable. Gracias. – Synesso

1

Prueba esto:

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

La firma del método invoke es public Object invoke(Object obj, *Object... args*) e idea tiene una inspección que se dispara cuando el paso de una matriz cuando se espera una vararg del mismo tipo en su lugar.

Cuestiones relacionadas