A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© java陈辉 中级黑马   /  2013-12-8 21:10  /  1306 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 java陈辉 于 2013-12-9 20:05 编辑

public class Person {
      public static void main(String[] args){
      System.out.println("mian");
     }
}

public class ReflectDemo{
    public static void main(String[] args) throws Exception {
    demo1();
}
      private static void demo1() throws Exception {
       Class clazz=Class.forName("cn.itcast.bean.Person");
       Method method=clazz.getMethod("main",String[].class);
      method.invoke(null, new String[]{"aa","bb"});
    }
}
       为什么通过反射调用Person类中的main方法会报错,提示:Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments,求解释。

评分

参与人数 1技术分 +1 收起 理由
贺奕凯 + 1

查看全部评分

4 个回复

倒序浏览
method.invoke(null, new String[]{"aa","bb"});
将这句话改为其中一句:
method.invoke(null, (object)new String[]{"aa","bb"});   //转换为对象
method.invoke(null, new object[]{new String[]{"aa","bb"}});  // 在包一个数组
为了兼容jdk1.4他在对数组进行解包,也就是“aa”,“bb”;
所有我们可以对其在包成一个数组,还可以将这个数组转换成一个对象,

评分

参与人数 1技术分 +1 收起 理由
贺奕凯 + 1

查看全部评分

回复 使用道具 举报 1 0
1楼说得很清楚了,这是因为java是向下兼容的,在1.4版本中还没有出现可变参数,所以java采用数组方法将未知的参数变量打包。你写的new String[]{"aa","bb"}会拆开来的。所以得把要传入的数组也打包成一个参数。方法就是:

method.invoke(null, (object)new String[]{"aa","bb"});   //转换为对象
method.invoke(null, new object[]{new String[]{"aa","bb"}});  // 把数组打包一下


评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
method.invoke(null, new String[]{"aa","bb"});
这名话不对
java在1.5以后才出的可变参数,为了兼容之前的
在传入一个数组时,默认是会解包的,在这句话中就是将数组已经拆成了字符串
有两种方式解决
1.
method.invoke(null, new Object[]{new String[]{"aa","bb"}});//将String 数组放到 Object数组
2.
method.invoke(null, (Object)new String[]{"aa","bb"});//将数组转换成Object对象
这样做是告诉JVM我传入的是一个对象,那么JVM在运行时就不会将它拆开

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
方式一:method.invoke(null, (object)new String[]{"aa","bb"}); 这种方式就是告诉JVM我传入的是一个对象,你不需要拆包了。
方式二:method.invoke(null, new object[]{new String[]{"aa","bb"}});
这种方式是外面再包一层object数组。
之所以要这样,是因为可变参数是jdk1.5的新特性,但是同时又要兼容1.4的老特性。所以才会出现这样的问题

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马