我有一个Class对象,我想调用一个静态方法。我有以下代码。
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[]{});
此打印:
1 [class [Ljava.lang.String;] main
但是随后它抛出:
IllegalArgumentException: wrong number of arguments
我在这里俯瞰什么?
您将不得不使用
m.invoke(null, (Object)new String[]{});
invoke(Object, Object...)
方法接受invoke(Object, Object...)
。 (Correction)传递的Object...
数组用作String[]
,并且为空,因此它没有要传递给方法调用的元素。通过将其强制转换为Object[]
,您说的是包装Object
中的唯一元素。
这是由于数组协方差。你可以做
Object[]
因为public static void method(Object[] a) {}
...
method(new String[] {});
是String[]
。
Object[]
或者,您也可以将System.out.println(new String[]{} instanceof Object[]); // returns true
包装在String[]
中>
Object[]
然后该方法将使用
m.invoke(null, new Object[]{new String[]{}});
中的元素作为方法调用的参数。
注意调用Object[]
的StackOverflowError。
您可以执行此操作: