6

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?

Community
  • 1
  • 1
Synesso
  • 37,610
  • 35
  • 136
  • 207

2 Answers2

6

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"} });
Sergey Kalinichenko
  • 714,442
  • 84
  • 1,110
  • 1,523
1

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.

athspk
  • 6,722
  • 7
  • 37
  • 51