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