黑马程序员技术交流社区

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

作者: 陪你等日出    时间: 2014-3-1 13:08
标题: 反射问题
用反射的方法透过编译器向泛型限定为Integer类型的集合中添加String类型的值时
ArrayList<Integer> list = new ArrayList<Integer>();
  list.getClass().getMethod("add", Object.class).invoke(list, "abc");
  System.out.println(list.get(0));
这样可以;

ArrayList<Integer> list = new ArrayList<Integer>();
  list.getClass().getMethod("add", String.class).invoke(list, "abc");
  System.out.println(list.get(0));
这样为什么不可以,getMethod()方法的第二个参数不是代表要获取的方法的参数类型吗?那怎么不能
写String.class了?
作者: 李白衣    时间: 2014-3-1 13:23
因为 add 方法的参数是可以接收任何类型的,在 JDK 1.5之前 其形参类型就是用 Object 表示的,写Strig.class自然找不到方法。
作者: volvoxc    时间: 2014-3-1 14:02
getMethod()方法获得的是ArrayList中的方法,在ArrayList中,没有add(String str)这个方法啊。
在泛型出现之前,是add(Object obj),在泛型出现之后,是add(E e)。
作者: 陪你等日出    时间: 2014-3-1 15:07
volvoxc 发表于 2014-3-1 14:02
getMethod()方法获得的是ArrayList中的方法,在ArrayList中,没有add(String str)这个方法啊。
在泛型出现 ...

理解了,我一直以为这个参数是后面实际调用方法时存入的参数类型,谢谢你!
作者: 陪你等日出    时间: 2014-3-1 15:10
李白衣 发表于 2014-3-1 13:23
因为 add 方法的参数是可以接收任何类型的,在 JDK 1.5之前 其形参类型就是用 Object 表示的,写Strig.clas ...

理解了,我一直以为这个参数是后面实际调用方法时存入的参数类型,谢谢你!




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