Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Call method via reflection when argument is of type Object[]

I am using reflection to call a method on a class that is dynamically constructed at runtime:

public String createJDBCProvider(Object[] args)

Here's how:

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

IDEA warns me that I'm guilty of redundant array creation for calling varargs method.

The method I'm calling actually takes an Object[], not Object ... but they're probably equivalent and interchangeable I think, so I forge ahead.

At runtime I get:

java.lang.IllegalArgumentException: wrong number of arguments

So it seems that, perhaps, my Object[] is being passed as a sequence of Objects. Is this what is happening? If so, how can I coerce it to not do so?

like image 495
Synesso Avatar asked Mar 07 '12 04:03

Synesso


2 Answers

The way you are calling the method, the reflection thinks that you are passing three individual parameters, rather than a single array parameter. Try this:

id = (String) m.invoke(adminTask, new Object[]{ new Object[] {"a", "b", "c"} });
like image 83
Sergey Kalinichenko Avatar answered Oct 22 '22 00:10

Sergey Kalinichenko


Try this:

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

The signature of the method invoke is public Object invoke(Object obj, *Object... args*) and Idea has an inspection that triggers when passing an array when a vararg of the same type is expected instead.

like image 43
Amine Rounak Avatar answered Oct 22 '22 01:10

Amine Rounak