Java反射给泛型集合赋值
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包内的某个方法中,详细是哪个记不太清了,模仿着写写):
public List testReflect(Object arg[], List list) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
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。。。。
不过后来发现原因之后,感觉其实也不复杂,挺简单的,还是经验太少,判断错误能力不行,共勉。
Java反射给泛型集合赋值的更多相关文章
- 深入分析Java反射(三)-泛型
前提 Java反射的API在JavaSE1.7的时候已经基本完善,但是本文编写的时候使用的是Oracle JDK11,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行 ...
- 将java类的泛型集合转换成json对象
一般用extjs开发传输都是用json比较多,这个将来大家也许会用到... ConvertJsonUtils.java package com.sunweb.util.jsonfactory; imp ...
- 2015第22周六Java反射、泛型、容器简介
Java的反射非常强大,传递class, 可以动态的生成该类.取得这个类的所有信息,包括里面的属性.方法以及构造函数等,甚至可以取得其父类或父接口里面的内容. obj.getClass().getDe ...
- java 反射 子类泛型的class
很早之前写过利用泛型和反射机制抽象DAO ,对其中获取子类泛型的class一直不是很理解.关键的地方是HibernateBaseDao的构造方法中的 Type genType = getClass() ...
- Java反射,泛型在Json中的运用
最近项目中遇到了Json数据自动获取的功能,不然令人想起java的反射,已经很长时间没复习java了正好一块连java的这一块内容一起过一遍.java中的反射无疑就相当于java开发者的春天,在众多的 ...
- java 反射和泛型
反射 在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问.检测和修改它本身状态或行为的一种能力.[1]用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为. 要注意术 ...
- 利用特性和反射给泛型Model赋值
为了解决从数据库读取的表字段和自己建的viewModel字段名称不相符的问题 本人小白,初次将特性及反射应用到实例,写的不好的地方还请大家多多包涵 新建一个控制台应用程序命名为ReflectAndAt ...
- java 反射和泛型-反射来获取泛型信息
通过指定对应的Class对象,程序可以获得该类里面所有的Field,不管该Field使用private 方法public.获得Field对象后都可以使用getType()来获取其类型. Class&l ...
- java反射获得泛型参数getGenericSuperclass():获取到父类泛型的类型
public class Person<T> { } import java.lang.reflect.ParameterizedType; import java.lang.reflec ...
随机推荐
- 工作组规划器(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 好像前面每分配一次任务,都要打开一个对话框,有木有简单粗暴点的法子啊? 必须有啊! 视图里有一种[工作组规划器],想要粗暴 ...
- 别被调查汇总郁闷到——有Excel呢!
年初的某天,我在家待得好好的,好吧,其实也不是待得好好的,这事大家都知道,新冠病毒嘛,都锁家里了,还好本妖向来宅--呃--跑题了--肥来! 其实我能在家好好地待着,有水有电有Wi-Fi,那是有多少人冒 ...
- mvn 把本地jar包打包到本地仓库中
命令如下: mvn install:install-file -Dfile=apache-ant-zip-2.3.jar -DgroupId=com.ckfinder -DartifactId=apa ...
- React-Router(一)
React-Router基础知识 import React from "react"; import { BrowserRouter as Router, Switch, Rout ...
- restTemplate 接收list数据
User[] users= restTemplate.getForObject(url, User[].class); 使用数组接收
- VMware 打开虚拟机出现另一个程序已锁定文件的一部分,进程无法访问
打开虚拟机出现 另一个程序已锁定文件的一部分,进程无法访问 打不开磁盘"D:\Virtual Machines\CentOS 7 64 位\CentOS 7 64 位.vmdk"或 ...
- 【LeetCode】987. Vertical Order Traversal of a Binary Tree 解题报告(C++ & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS BFS 日期 题目地址:https://le ...
- 【LeetCode】855. Exam Room 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/exam-roo ...
- LeetCode1239串联字符串的最大长度
题目 给定一个字符串数组 arr,字符串 s 是将 arr 某一子序列字符串连接所得的字符串,如果 s 中的每一个字符都只出现过一次,那么它就是一个可行解. 请返回所有可行解 s 中最长长度. 解题 ...
- Frp内网穿透搭建,家庭主机对外提供接口,支持ssh访问
Frp内网穿透搭建,家庭主机对外提供接口,支持ssh访问 1.使用场景: 需求1.家中服务器 ubuntu 主机,跑接口服务,需要对外暴漏, 需求2.同时需要在外网ssh远程 关键词: frp内网 ...