关于Java反射给泛型集合赋值问题

网友投稿 250 2022-09-03


关于Java反射给泛型集合赋值问题

泛型

java泛型简单描述下:

比如创建一个List集合,我想在里边只放Student对象信息,就需要写成

List studentList = new ArrayList();

这个时候List里面就只能放入Student类型的值,如果强行放入其他类型(比如说Integer)的就会提示错误信息:

java.lang.ClassCastException: java.lang.Integer cannot be hEtPucast to com.entity.Student

按照这个结果来看,studentList里面就只能放入Student类型的值,没有什么问题。

然后,奇怪的事情发生了,在公司项目的log里发现了一个error:

java.lang.ClassCastException: java.lang.Integer cannot be cast to com.entity.Student

原代码类似于:

Student student = studentList.get(0);

What? 集合创建的时候明明给的泛型是Student啊,这个String是哪蹦出来的。

这个时候又得提出一个概念:

反射

比较全面的解释:

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

一通debug,我发现了这么一段代码(来自于hutools包内的某个方法中,详细是哪个记不太清了,模仿着写写):

Class extends List> aClass = list.getClass();

Method method = aClass.getMethod("add", Object.class);

for (Object o : arg) {

method.invoke(list, o);

}

return list;

}

差不多就这样子,入参是[1,2,3,4]和studentList,在外边取list中的值时,发现:

java.lang.ClassCastException: java.lang.Integer cannot be cast to com.entity.Student

这玩意,利用反射获取了List的add方法,值类型也不判断,直接给塞进集合里了。。。。

其实刚开始碰到时,一脸懵的,耗费了很长时间取排查问题,我泛型Student的List,怎么会出现这种问题,从List中取出来的值不能转换成Student。。。。

不过后来发现原因之后,感觉其实也不复杂,挺简单的,还是经验太少,判断错误能力不行,共勉。

上面的代码用的Student类和String、Integer代替,公司内部代码就不透露了。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python爬虫-02-http协议认识,以及python爬虫相关知识点认识
下一篇:【Python技能树共建】字符编码与解码
相关文章

 发表评论

暂时没有评论,来抢沙发吧~