Synesso
Synesso

Reputation: 38988

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?

Upvotes: 6

Views: 7258

Answers (2)

Amine Rounak
Amine Rounak

Reputation: 11

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.

Upvotes: 1

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 726909

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"} });

Upvotes: 6

Related Questions