我有一个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[]{});
打印:
然后然后抛出:
IllegalArgumentException: wrong number of arguments
我在这里俯瞰什么?
答案 0 :(得分:10)
你必须使用
m.invoke(null, (Object)new String[] {});
invoke(Object, Object...)
方法接受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[]
中的元素作为方法调用的参数。
小心调用main(..)
的StackOverflowError。
答案 1 :(得分:0)
你可以这样做:
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());
String[] a = new String[1];
m.invoke(null,a);