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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 庄纪光 黑马帝   /  2011-10-15 08:46  /  3074 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

黄锋 黑马帝 2011-10-15 09:55:56
楼主
List<Integer> list=new ArrayList<Integer>();
Method methodAdd=list.getClass().getMethod("add", Object.class);//用Method反射你要用的方法
methodAdd.invoke(list, "hello");
System.out.println(list.get(0));

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
如何在数组ArrayList<Integer>中添加一个String类型的元素?要用到反射的知识,不是很明白。求解答!

6 个回复

倒序浏览
邢勇 黑马帝 2011-10-15 09:07:57
藤椅
张老师的视频没有认真看吧,讲反射那里有的
回复 使用道具 举报
回答这个问题我们得先明白一下两点:
泛型的作用:可以在编译器对存入容器的元素类型做限制的作用。
反射的特性:反射可以绕过编译器的检查,进入运行期,而再运行期泛型就失效了。
反射的一个很重要的作用就是你说的这道题中得到了体现。

评分

参与人数 1技术分 +1 黑马币 +1 收起 理由
admin + 1 + 1

查看全部评分

回复 使用道具 举报
朱华 黑马帝 2011-10-17 13:59:59
报纸
纯手打,请区分。
具体的代码就不贴了,楼上贴过,视频里也有。
还记得异常吗,异常分为编译时异常以及运行时异常,指的是当你在编译阶段就出现的错误编译器会给你指出来,但是编译结束,程序在运行时的错误编译器就无法识别了,因为那是动态的,所以你忽略了一句话,泛型的检查只在编译期有效,所以当你使用反射的方法往里面设值的时候,编译器是无非检查你在运行时放入的值类型的,所以你可以在一个List<Integer>中放入String

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
追根溯源,我们知道在一个类中的属性,在堆内存中是以字节码的形式存储的,是没有具体的类型的,因此数组ArrayList<Integer> 和 String类型的元素,在堆内存中的类型都是Class类型,所以只要我们获得了他们的字节码文件就可以实现添加操作了。获取字节码文件的方式:1.使用Class类的forName()静态方法;2.调用某个类的class属性;3.调用某个对象的getClass()方法。

评分

参与人数 1技术分 +2 黑马币 +1 收起 理由
admin + 2 + 1

查看全部评分

回复 使用道具 举报
刘江华 黑马帝 2011-10-18 23:20:32
7#
类型限定只是在编译的时候才有用。但程序运行。在内存中变成字节码的时候,就没有类型限定啦。反射就是在程序运行的时候工作。这样就可以将不同的类型插入进去了。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

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