黑马程序员技术交流社区

标题: 反射的小问题 [打印本页]

作者: 喝龙血的我    时间: 2013-10-9 20:06
标题: 反射的小问题
本帖最后由 喝龙血的我 于 2013-10-10 08:09 编辑
  1. ArrayList<Integer> collection = new ArrayList<Integer>();
  2.   collection.add(1);
  3.   collection.add(2);
  4.   Method add = collection.getClass().getMethod("add", Object.class);
  5.   add.invoke(collection, "abc");
  6.   System.out.println(collection.get(2));
复制代码
上边是老师视屏中的代码
  1. ArrayList<String> collection1 = new ArrayList<String>();
  2.   collection1.add("abc");
  3.   collection1.add("def");
  4.   Method add1 = collection1.getClass().getMethod("add", Object.class);
  5.   add1.invoke(collection1, 1);
  6.   System.out.println(collection1.get(2));
复制代码
这个是我根据老师改的,只是换个了类型,为什么就不能运行了呢??报了异常




作者: winsking    时间: 2013-10-9 20:16
本帖最后由 winsking 于 2013-10-10 11:42 编辑

System.out.println(collection1.get(2));报错,最后一句哦,不是invoke出错新帖地址:
http://bbs.itheima.com/forum.php?mod=viewthread&tid=87906&page=1&extra=#pid498545

作者: 喝龙血的我    时间: 2013-10-9 20:17
winsking 发表于 2013-10-9 20:16
个人理解:
add1.invoke(collection1, 1);是不对的,基本数据类型是不能被添加进去的,应该改成
add1.invok ...

不能够自动装箱吗?
作者: winsking    时间: 2013-10-9 20:34
本帖最后由 winsking 于 2013-10-10 11:43 编辑
喝龙血的我 发表于 2013-10-9 20:17
不能够自动装箱吗?

偶也在研究中...
作者: 喝龙血的我    时间: 2013-10-9 20:39
winsking 发表于 2013-10-9 20:34
自动装箱是很好,但是Java也没有这么智能吧,集合中不能添加基本数据类型,编译就通不过的
反射获取的方 ...

我测试了下  换成new  Integer(1) 依然报类型转换异常
作者: 黄绍楷    时间: 2013-10-9 21:18
自动装箱: Integer i = 1;
相当于编译器自动做一下语法编译: Integer i  = new Integer(1);
但前提是你要声明为Object类型
你的add1.invoke(collection1,1);   api中后面的参数类型默认为Object,
而你这样写相当于是int i = 1;
而不是Integer i = 1;
所以无法自动装箱。运行会出现类型异常
作者: 喝龙血的我    时间: 2013-10-9 21:21
黄绍楷 发表于 2013-10-9 21:18
自动装箱: Integer i = 1;
相当于编译器自动做一下语法编译: Integer i  = new Integer(1);
但前提是你 ...

那怎么让这段代码通过呢?把1换成  new Integer(1)还是报异常的啊
作者: 黄绍楷    时间: 2013-10-9 21:35
额,因为你用了泛型,参数必须和前面的泛型类型一致,所以只要add1.invoke(collection1,"1"); 加个引号就行,如果是想试验不同类型转换,删除泛型就ok
作者: 毋须繁华    时间: 2013-10-9 22:24
  1. ArrayList<Integer> array = new ArrayList<Integer>();

  2.                 // array.add("hello");

  3.                 Class c = array.getClass();
  4.                 Method m = c.getMethod("add", Object.class);

  5.                 m.invoke(array, "hello");
  6.                 m.invoke(array, "world");
  7.                 m.invoke(array, true);

  8.                 System.out.println(array);
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2