为了账号安全,请及时绑定邮箱和手机立即绑定

通过反射调用带可变参数方法运行失败

通过反射调用带可变参数方法运行失败

慕森王 2019-02-24 22:08:20
我通过反射调用一个带有可变参数的方法是运行失败,代码如下。 public class Main { public static void func(Object... objs){ for (Object obj : objs){ System.out.println(obj); } } public static class Tester{ public static void main(String... args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { Class<?> clazz = Class.forName("com.xxxx.Main"); Method method1 = clazz.getMethod("func", Object[].class); method1.invoke(null, new Object[]{1, "2"}); } } } 异常信息如下 Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.zeeker.reflect.Main$Tester.main(Main.java:30) 这其中是有什么猫腻?
查看完整描述

3 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

method1.invoke(null, (Object)new Object[]{1,"2"});

查看完整回答
反对 回复 2019-03-01
?
慕森卡

TA贡献1806条经验 获得超8个赞

//这样子也可以
method1.invoke(null, new Object[]{new Object[]{1}});

查看完整回答
反对 回复 2019-03-01
?
MYYA

TA贡献1868条经验 获得超4个赞

这个主要是兼容问题。为了兼容可变参数出来之前的版本,那时候主要使用数组来实现。所以 如果你穿入得是个数组,jvm会解开 所以包装一下就好了

查看完整回答
反对 回复 2019-03-01
  • 3 回答
  • 0 关注
  • 614 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信