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

 更新时间:2022年01月14日 16:51:16   作者:柳先开  
这篇文章主要介绍了Java反射给泛型集合赋值,需要的朋友可以参考下

泛型

Java泛型简单描述下:

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

List<Student> studentList = new ArrayList();

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

java.lang.ClassCastException: java.lang.Integer cannot be cast 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代替,公司内部代码就不透露了。

到此这篇关于Java反射给泛型集合赋值的文章就介绍到这了,更多相关Java反射给泛型集合赋值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • javaweb中Filter(过滤器)的常见应用

    javaweb中Filter(过滤器)的常见应用

    这篇文章主要介绍了javaweb中Filter的常见应用,过滤器的使用方法,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • Kafka单节点伪分布式集群搭建实现过程详解

    Kafka单节点伪分布式集群搭建实现过程详解

    这篇文章主要介绍了Kafka单节点伪分布式集群搭建实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 使用springmvc的controller层获取到请求的数据方式

    使用springmvc的controller层获取到请求的数据方式

    这篇文章主要介绍了使用springmvc的controller层获取到请求的数据方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • SpringBoot枚举类型参数认证的实现代码

    SpringBoot枚举类型参数认证的实现代码

    项目当中经常需要接口参数是否在一个可选的范围内,也就是验证类枚举参数的需求,所以本文我们将使用SpringBoot实现枚举类型参数认证,文中有详细的代码示例,需要的朋友可以参考下
    2023-12-12
  • java中封装JDBC工具类的实例分析

    java中封装JDBC工具类的实例分析

    在本篇内容里小编给各位分享了一篇关于java中封装JDBC工具类的实例分析,对此有兴趣的朋友们可以学习下。
    2021-03-03
  • common-upload上传文件功能封装类分享

    common-upload上传文件功能封装类分享

    本文介绍一个common-upload上传封装类,为了更方便的上传文件,对common-upload进行了一个简单的封装,大家参考使用吧
    2014-01-01
  • Java中覆盖finalize()方法实例代码

    Java中覆盖finalize()方法实例代码

    这篇文章主要介绍了Java中覆盖finalize()方法实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • ehcache模糊批量移除缓存的方法

    ehcache模糊批量移除缓存的方法

    本篇文章主要介绍了ehcache模糊批量移除缓存的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Mybatis之@ResultMap,@Results,@Result注解的使用

    Mybatis之@ResultMap,@Results,@Result注解的使用

    这篇文章主要介绍了Mybatis之@ResultMap,@Results,@Result注解的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 详解Java中的final关键字

    详解Java中的final关键字

    子类可以在父类的基础上改写父类内容,为了避免这种随意改写的情况,Java提供了final 关键字,用于修饰不可改变内容。本文就来详细说说final关键字的使用,需要的可以参考一下
    2022-10-10

最新评论