黑马程序员技术交流社区

标题: 如何将str="abc"存入到一个List<Integer> 中?带来的反射的一些... [打印本页]

作者: 胡建彪    时间: 2012-9-21 11:14
标题: 如何将str="abc"存入到一个List<Integer> 中?带来的反射的一些...
// 如何将str="abc"存入到一个List<Integer> 中?
      第一种方式:
class  Person{}
public class  ReflectDemo{
      
        List<Integer> list = new ArrayList<Integer>();
        String  str3 ="abc";
        list.getClass().getMethod("add",Object.class).invoke(list,str3) ;
        //此处只能用Object.class,用Integer.class和String.class 都报错误。难道getMethod()这个方法接收的第二个参数不是方法的参数类型的字节码文件?
       // 难道getMethod("add",Object.class)是说 反射拿得到的add 方法和 list api下面的add 方法不一样? 求大虾正解。

        System.out.println("...."+list);
}
运行结果: ....[abc]
      由于以上对Object.class 的思考,我把 List<Integer> list = new ArrayList<Integer>();的泛型换成任意类型。List<String> list = new ArrayList<String>(); List<Person> list = new ArrayList<Person>(); 运行结果依然是 [abc].  这是不是说明用反射的方式在集合中添加元素时,可以忽略泛型对集合元素的限定?
    第二种方式:
我想到另一种方式,可能不正确,求大虾们一起搞定它。
public class  ReflectDemo1{
      
         List<Integer> list = new ArrayList<Integer>();
        String  str3 ="abc";
      
        Constructor <Integer> con;
        try {
            con = Integer.class.getConstructor(Integer.class);
            Integer  in= con.newInstance(str3);// 相当于 Integer in = new Integer(str3);
            //API--构造方法Integer(String s) 构造一个新分配的 Integer 对象,它表示 String 参数所指示的 int 值。
            System.out.println("in"+in);
            list.add(in);
        } catch (Exception e) {
            e.getStackTrace();
        }
        System.out.println("...."+list);
}
运行结果:....[], in也没有打印说明 try 中的语句可能没有执行。 这是怎么回事?



作者: 彭润生    时间: 2012-9-21 11:18
本帖最后由 彭润生 于 2012-9-21 11:26 编辑

这样会抛异常,java.lang.NoSuchMethodException:Integer里面没有这个方法。这样搞不想。这个不比泛型,泛型在编译的时候可以去掉限制,但你这个Integer没有泛型,所以你传一个String类型的东西当然会报错。

作者: 胡建彪    时间: 2012-9-22 11:10
彭润生 发表于 2012-9-21 11:18
这样会抛异常,java.lang.NoSuchMethodException:Integer里面没有这个方法。这样搞不想。这个不比泛型,泛 ...

对于第一个问题:应该是add默认添加的就是Object对象,然后是由我们在指定添加什么类型的元素,但是反射直接获得了add方法的字节码,不知道我们指定什么类型的元素,所以就 Object.class 了。
第二个问题:改成 List<Person> list = new ArrayList<Person>();一样正确运行,说明 此时的泛型限定已经被忽略了,也就是 泛型是在编译时检测,而此例我们是用反射获得add()的字节码,跳过了编译,所以在 List做泛型限定 已经没有作用。
第三个问题: 就是第二种方式,还是有点不明白,能否详细说明一下? Thanks for replying!
作者: 赵永康    时间: 2012-9-22 11:59
我记得好像是带有泛型的字节码在往内存中加载字节码的时候,泛型的元素类型并不能够加载进去,也就是张老师说的去类型化,所以,我们才能够往已定义好泛型的集合中,用反射的方式存储另一种类型的元素。在加强下张老师的加强视频  还是挺有用的




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