我有一个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这样的方法? 谢谢