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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 朱玉玺 中级黑马   /  2013-1-19 23:37  /  3538 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 zyx67786110 于 2013-1-20 19:31 编辑
  1. <p>package cn.itcast.day1;

  2. import java.lang.reflect.Method;


  3. public class ReflectTest {

  4. public static void main(String[] args) throws Exception {

  5.          //用反射的方式调用类中的main方法;   
  6.          String startingClassName =args[0];
  7.                 Method mainMethod =Class.forName(startingClassName).getMethod("main",String[].class);
  8. /*
  9. 问题一:这是张老师在讲获取main方法时,不能直接将 String[] arg s数据传进去,而提出的两种方法,谁能其中的原因更详细的解释下?
  10. */
  11. mainMethod.invoke(null,new Object[]{new String[]{"ball","wife"}});
  12. mainMethod.invoke(null,(Object)new String[]{"ball","wife"});
  13. /*
  14. 下边这一行中,为什么用new Object[]{}包一下就可以,而我用new String[] {}包一层就不行?
  15. */
  16. //                mainMethod.invoke(null,new String[]{new String[]{"ball"}});

  17. //数组反射中的问题。
  18. int[] a1 =new  int [3];
  19.                 int[] a2 = new int [4];
  20.                 int[][] a3 = new int[2][3];
  21.                 String[] a4 = new String[3];//{"111","222","333"};
  22.                 Class cl1 =a1.getClass();
  23.                 System.out.println(a1.getClass() == a2.getClass());
  24.                 System.out.println(a1.getClass() == a3.getClass());
  25.                 System.out.println(a1.getClass() == a4.getClass());
  26. /*
  27. 问题二:
  28. 上边的后个输出语句,会报错,错误信息如下,

  29. Exception in thread "main" java.lang.Error: Unresolved compilation problems:
  30. Incompatible operand types Class<capture#10-of ? extends int[]> and Class<capture#11-of ? extends int[][]>
  31. Incompatible operand types Class<capture#12-of ? extends int[]> and Class<capture#13-of ? extends String[]></p><p> at cn.itcast.day1.ReflectTest.main(ReflectTest.java:67)

  32. 既然张老师的视频里边能运行,说明是能通过编译的,为什么在我机子上就不行了?此外,如果是版本问题,新版本的不应该兼容原来的版本吗?
  33. */  
  34.         }

  35. class TestArguments{
  36.         public static void main(String [] args){
  37.                 for(String arg:args)
  38.                 {
  39.                         System.out.println(arg);
  40.                 }
  41.         }
  42. }
  43. </p>
复制代码

点评

建议你去查一下API,对于invoke方法,在4 和 5 版本中,是有什么样的差别。你可以对于这部分视频多看几遍,相信你会有所收获的  发表于 2013-1-20 11:16

评分

参与人数 1技术分 +1 收起 理由
黄锦成 + 1

查看全部评分

2 个回复

倒序浏览
下边这一行中,为什么用new Object[]{}包一下就可以,而我用new String[] {}包一层就不行?
mainMethod.invoke(null,new String[]{new String[]{"ball"}});
解答:String[]里面放的是String,你现在在String[]里面放String[],肯定错了。用Object[]包装就没问题,因为数组本来就是Object
关于为什么不能直接传入一个一维数组,这是因为JDK1.4和JDK1.5的关系,这个设置不是很好。JDK1.4中会把数组拆包,把里面的元素当做方法的参数传进去。我们本来就是想把数组当做一个参数,这就违背了我们的初衷。

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 zyx67786110 于 2013-1-20 13:35 编辑
黄锦成 发表于 2013-1-20 11:14
下边这一行中,为什么用new Object[]{}包一下就可以,而我用new String[] {}包一层就不行?
mainMethod.inv ...

多谢版主点评。看完后,本来我还想再用String[][]试试,但考虑到String[].class !=String[][].class,应该还是错的,F2后,MyEclipse已经明确提示咱了:
The argument of type String[][] should explicitly be cast to (明确地转化成)Object[] for the invocation of the varargs method invoke(Object, Object...) from type Method. It could alternatively be cast to Object for a varargs invocation。
自己何必画蛇添足,多此一举呢。
不过,(Object)后,调用的是jdk1.5可变参数的方法invoke(Object, Object...) 利用新特性。这个在1.4版本中肯定是不能编译通过的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马