为什么通过反射调用main时参数数目错误?

问题描述 投票:6回答:2

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

我在这里俯瞰什么?

java reflection
2个回答
10
投票

您将不得不使用

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。


0
投票

您可以执行此操作:

© www.soinside.com 2019 - 2024. All rights reserved.