在通过反射调用main时,为什么我的参数数量错误?

时间:2014-02-25 18:00:39

标签: java reflection

我有一个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;]

然后然后抛出:

IllegalArgumentException: wrong number of arguments

我在这里俯瞰什么?

2 个答案:

答案 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);