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

Oth*_*ers 6 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[]{});
Run Code Online (Sandbox Code Playgroud)

这打印:

  • 1
  • [class [Ljava.lang.String;]
  • 主要

但随后它抛出:

IllegalArgumentException: wrong number of arguments
Run Code Online (Sandbox Code Playgroud)

我在这里俯瞰什么?

Sot*_*lis 10

你将不得不使用

m.invoke(null, (Object)new String[] {});
Run Code Online (Sandbox Code Playgroud)

invoke(Object, Object...)方法接受a Object....(更正)String[]传递的数组用作它Object[]并且为空,因此它没有要传递给方法调用的元素.通过将它转换为Object,你说这是包装中唯一的元素Object[].

这是因为阵列协方差.你可以做

public static void method(Object[] a) {}
...
method(new String[] {});
Run Code Online (Sandbox Code Playgroud)

因为a String[]是a Object[].

System.out.println(new String[]{} instanceof Object[]); // returns true
Run Code Online (Sandbox Code Playgroud)

或者,你可以包装你String[]Object[]

m.invoke(null, new Object[]{new String[] {}});
Run Code Online (Sandbox Code Playgroud)

然后,该方法将使用Object[]方法调用的as参数中的元素.

小心调用StackOverflowError main(..).