当前位置: 首页 > 面试题库 >

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

桓智敏
2023-03-14
问题内容

我有一个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...)方法接受Object...
(更正)String[]传递的数组按原样使用Object[]并且为空,因此它没有要传递给方法调用的元素。通过将其强制转换为对象Object,这就是包装中的唯一元素Object[]

这是由于数组协方差。你可以做

public static void method(Object[] a) {}
...
method(new String[] {});

因为a String[]Object[]

System.out.println(new String[]{} instanceof Object[]); // returns true

另外,您也可以将其包装String[]Object[]

m.invoke(null, new Object[]{new String[]{}});

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

注意调用的StackOverflowError main(..)



 类似资料:
  • 如果反射值对象(reflect.Value)中值的类型为函数时,可以通过 reflect.Value 调用该函数。使用反射调用函数时,需要将参数使用反射值对象的切片 []reflect.Value 构造后传入 Call() 方法中,调用完成时,函数的返回值通过 []reflect.Value 返回。 下面的代码声明一个加法函数,传入两个整型值,返回两个整型值的和。将函数保存到反射值对象(refle

  • 问题内容: 据我了解,以下代码应该打印,但是当我运行它时,它可以打印。 根据JLS§5.1.7。装箱转换: 如果该值被装箱是,,一个,或一个在所述范围内对或或之间号和(含),然后让和是任何两个装箱转换的结果。总是这样的。 但是,在通过反射调用方法的情况下,始终通过创建框值。 请帮助我理解这一点。 问题答案: 调用将 始终 返回一个新的。所有返回的原语都装箱。 …如果[return]值具有原始类型,

  • 我正在使用mockito并使用java6和Spring进行开发。

  • 问题内容: 想象以下情况: 我正在专门使用反射来分析MyClass ,在这种情况下,我将获得以下字段(和Types,使用Field的getType()): 我想获取T的实际Type,由于扩展符号中的显式“ String”,因此在运行时就知道了它,我该如何获取myField的非遗传类型? 解决的编辑: 答案似乎是“你做不到”。对于以后可能看这个问题的人,我建议使用Jackson(我试图这样做来生成J

  • 我使用Java11和Spring。我试图通过post将两个对象发送到控制器,但我得到了一个错误。 这里是控制器: 你知道为什么我会得到这个错误以及如何修复它吗?

  • 我有一个方法如下: 为了通过反射调用此函数,我尝试了以下代码段,但结果不成功: 那么,有没有一种方法可以通过Java反射调用像findEntity这样的方法? 谢谢