I have a Class object and I want to invoke a static method. I have the following code.
Method m = cls.getMethod("main", String[].class);
System.out.println(m.getParameterTypes().length);
System.out.println(Arrays.toString(m.getParameterTypes()));
System.out.println(m.getName());
m.invoke(null, new String[]{});
This prints:
1 [class [Ljava.lang.String;] main
But then it then it throws:
IllegalArgumentException: wrong number of arguments
What am I overlooking here?
You will have to use
m.invoke(null, (Object)new String[]{});
The invoke(Object, Object...)
method accepts a Object...
. (Correction) The String[]
array passed is used as that Object[]
and is empty, so it has no elements to pass to your method invocation. By casting it to Object
, you are saying this is the only element in the wrapping Object[]
.
This is because of array covariance. You can do
public static void method(Object[] a) {}
...
method(new String[] {});
Because a String[]
is a Object[]
.
System.out.println(new String[]{} instanceof Object[]); // returns true
Alternatively, you can wrap your String[]
in an Object[]
m.invoke(null, new Object[]{new String[]{}});
The method will then use the elements in the Object[]
as arguments for your method invocation.
Careful with the StackOverflowError of calling main(..)
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With