反射的应用:泛型擦除

不问归期 提交于 2019-11-26 12:26:16

今天我们将要讲述一下反射的一个小应用,来帮助我们更好的理解反射的原理,这个小应用就是**能否在一个泛型为String的List集合中添加Integer类型的数据?**
经过前两篇的讲述,我们已经知道反射最大的一个机制就是我们可以通过配置文件在运行过程中动态的改变要运行的类或者方法,也就是编译时对于要运行的类不先进行编译,而在运行时再进行查看具体是哪一个类要执行。
根据反射的上述特性我们就能想到泛型。泛型与反射的机制正好相反,也就是在编译时检查泛型,而在运行阶段不再检查(“伪泛型”),我们先来看一下泛型这一特性的原因:
1、我们首先写两个list集合,泛型分别为String和Integer:

1 List<Integer> lIntegers = new ArrayList<Integer>();
2 List<String> lStrings = new ArrayList<String>();

2、点击查看两个List的源码,可以发现两个不同泛型的List是同一个接口:

了解了伪泛型是怎么回事后,就可以开始进行我们的应用测试了:
1、首先创建一个泛型为String的List集合,并添加上String类型的值

1 List<String> list = new ArrayList<String>();
2 list.add("爱跑步的大胖子");

2、使用反射获取add方法,并使用反射执行,添加字符串

1 //通过反射获取字节码对象
2 Class<? extends List> c = list.getClass();
3 //一定写object.class 表示什么类型都可以加
4 Method method = c.getMethod("add", Object.class);
5 //对下面这个方法有疑问的,可以去观看我的其它两篇反射文章,有详细的介绍
6 method.invoke(list, "爱跑步的大胖子");

3、打印list集合,我们可以发现Integer类型和String类型同时添加到了泛型为String的list集合中了:

希望这篇文章能对大家有帮助,能更好的帮助大家理解反射。
欢迎大家关注我的个人公众号:“爱跑步的大胖子”,我会在上边更新更多的Java知识。


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!