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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xuemeng 中级黑马   /  2013-5-20 13:42  /  2235 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 xuemeng 于 2013-5-20 15:24 编辑

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Demo {
public static void main(String[] args) throws ClassNotFoundException,
   NoSuchMethodException, SecurityException, IllegalAccessException,
   IllegalArgumentException, InvocationTargetException {
  // 程序运行时,会给本类的main方法传递一个参数, 这个参数是A, 其实就是args[0], 是A类的完整路径
  String startingClassName = args[0];
//通过传递值获取 方法对象
  Method m = Class.forName(startingClassName).getMethod("main",
    String[].class);
//问题就在这里, 调用main方法, 因为main方法是静态的, 所以使用null, 然后第二个参数就是调用main方法时指定的具体参数, main方法是String[] ,那么我这样传递一个String数组为什么会抛 java.lang.IllegalArgumentException: argument type mismatch 异常呢? 我搞不懂, 这里的非法参数异常提示为什么是参数类型不匹配, 这个在张老师的视频里面也没有说明, 张老师说的情况是如果数组中有多个元素, 那么会把数组打开, 每一个元素作为一个参数, 所以会出错,抛的异常信息是:java.lang.IllegalArgumentException: wrong number of arguments(参数的个数错误),这个我倒还算明白,因为把参数拆成了多个, 所以报错,  那么为什么我就给String[ ] 里面一个参数也会出错呢,按照我的想法,既然有多个元素你要拆分, 那么我就给你一个元素你就不会拆分了吧, 可事实并非如此? 而且还是提示的类型不匹配??搞不懂这个类型不匹配是怎么判断的, jvm到底是如何来判断我传递的参数类型不匹配?
  m.invoke(null, new String[] { "111" });
}
}
class A {
public static void main(String[] args) {
  for (String arg : args) {
   System.out.println(arg);
  }
}
}

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1

查看全部评分

13 个回复

正序浏览
画饼 发表于 2013-5-20 14:53
你好让我纠结啊。拆包出来,就是一个字符串啊,那怎么是个数错误,很明显类型错误 ...

   嗯明白了1!!!!!!!!!!!!!
回复 使用道具 举报
飞鸟青崖 发表于 2013-5-20 15:10
你传入的是一个String[],所以会按1.4的invoke进行拆开,并将其中的数组中 的元素当作参数传递给主函数,所 ...

嗯!!                                             

回复 使用道具 举报
你传入的是一个String[],所以会按1.4的invoke进行拆开,并将其中的数组中 的元素当作参数传递给主函数,所以这里传入的是一个String,但是主函数要的是String[],
这就出现错误了啊。
也就是说当你传入的是一个数组时,它就会拆开,不管你这里面有几个元素。当你传入的是参数个数为1时,它不会拆开,而是按invoke()1.5来运算。
回复 使用道具 举报
画饼 发表于 2013-5-20 14:53
你好让我纠结啊。拆包出来,就是一个字符串啊,那怎么是个数错误,很明显类型错误 ...

好吧,谢谢姐姐,我拿到分数了,谢谢
回复 使用道具 举报
xuemeng 发表于 2013-5-20 14:48
我也不知道啊!!
不过其实我也有那么点想法, 当数组中不论是多个元素,还是一个元素, 那么都会拆,当只有一 ...

你好让我纠结啊。拆包出来,就是一个字符串啊,那怎么是个数错误,很明显类型错误
回复 使用道具 举报
画饼 发表于 2013-5-20 14:26
呵呵,新人求技术分心切。莫怪,就是一个值得数组,应该也会拆分吧,拆分之后不就是stiring么。那就不是 ...

我也不知道啊!!
不过其实我也有那么点想法, 当数组中不论是多个元素,还是一个元素, 那么都会拆,当只有一个元素, 就直接拆成一个一个的字符串, 那样拆出来就是String类型的了, 那么参数类型错误也就能说的过去了! 只是不知道是否正确, 坐等高人回答!!
回复 使用道具 举报
Jacky_Chen1990 发表于 2013-5-20 13:45
好问题 占楼先

运行了一下,提示是数组越界错误哦。

这个我知道, 我问的是当传递的数组只有一个元素是如何拆的, 为何是参数类型错误???? 而不是参数个数错误? 张老师说的是, 因为String数组中有多个元素, 为了兼容1.4 的invoke(null, Object)后面的这个参数, 这个我明白啊!!
   
回复 使用道具 举报
画饼 中级黑马 2013-5-20 14:26:18
7#
xuemeng 发表于 2013-5-20 14:10
你没弄懂我的意思, 我知道会拆成多个参数 ,  可是为什么只有一个参数的时候也会出问题? 而且所抛异常虽然 ...

呵呵,新人求技术分心切。莫怪,就是一个值得数组,应该也会拆分吧,拆分之后不就是stiring么。那就不是数组了,应该是因为不管你是不是一个参数,他都进行拆分了吧,说得不好别生气哈,正确答案也告诉我一下
回复 使用道具 举报
本帖最后由 xuemeng 于 2013-5-20 14:12 编辑
画饼 发表于 2013-5-20 13:56
拆包之后就不是数组了,那肯定不匹配


你没弄懂我的意思, 我知道会拆成多个参数 ,  可是为什么只有一个参数的时候也会出问题? 而且所抛异常虽然也是非法参数, 但是提示的是参数类型异常, 而不是数组中有多个元素被拆成多个参数, 而抛的非法参数异常,并且提示是参数个数异常!! 当我传递的数组只有一个元素时, jvm是如何到底做了那些工作, 如何来判断我的参数类型异常?
回复 使用道具 举报
拆包之后就不是数组了,那肯定不匹配
回复 使用道具 举报
解决办法可以,数组外面多套一层数组,这样拆包之后就还是数组,或者,可以强制强转(Object)这样虚拟机就不会去拆包了
回复 使用道具 举报
这个是因为,数组自动拆包了,你传的数组如果多个值就被虚拟机以为你传了多个参数,而不是一个数组参数详情可以看张老师,数组的反射,跟对于成员方法接受数组那两集

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 Jacky_Chen1990 于 2013-5-20 14:11 编辑

好问题 占楼先

运行了一下,提示是数组越界错误哦。

你需要在run as里面配置一下,将A作为参数传入到String args[] 中才可以运行。

接着还会有问题,就是传入的参数是否匹配了。

为了兼容1.4,invoke(null,Object) 后面的这个参数如果是数组的话会被拆包,因此需要将它包起来。

有两个方法1.m.invoke(null, (Object)new String[] { "111","222","333" });

2.m.invoke(null,new Object[]{new String[]{"111","222","333"}});

两种方法结果是一样的。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

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