错误/异常:java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType 的解决方法

1、错误/异常视图

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘baseDao‘ defined in class path resource [spring/beans_common.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.oa.common.dao.impl.BaseDao]: Constructor threw exception; nested exception is java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType

错误/异常描述:反射类型转换失败(nested exception is java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType)

一开始我以为是baseDao注入失败/异常,然后我就仔细检查spring的配置文件(检查了N遍),发现一点问题都没有。后来,经过Debug一步一步调试,发现出错位置:BaseDao()构造器,原代码:

 1     private Class<T> clazz;
 2
 3     //反射机制,获取对应的对象
 4     @SuppressWarnings("unchecked")
 5     public BaseDao() {//构造函数的作用:获取对应的实体类对象
 6         // this——表示当前类(UserDao)
 7         // this.getClass()——当前运行类的字节码(UserDao.class)
 8         // this.getClass().getGenericSuperclass()——当前运行类的父类(BaseDao<T>,以为User为例,那就是BaseDao<User>)
 9         Type type = this.getClass().getGenericSuperclass(); // generic 泛型
10         // 强制转化“参数化类型”
11         ParameterizedType parameterizedType = (ParameterizedType) type;
12         // 参数化类型中可能有多个泛型参数
13         Type[] types = parameterizedType.getActualTypeArguments();
14         // 获取数据的第一个元素(User.class)
15         clazz = (Class<T>) types[0]; // com.oa.shore.entity.User.class
16     }

说明:我用的是SSH框架(注解版)。JDK-1.8;Tomcat-7.0.96

我用到的jar包:

    

2、解决方法

加个判断,即可解决:

 1 private Class<T> clazz;
 2
 3     //反射机制,获取对应的对象
 4     @SuppressWarnings("unchecked")
 5     public BaseDao() {//构造函数的作用:获取对应的实体类对象
 6         // this——表示当前类(UserDao)
 7         // this.getClass()——当前运行类的字节码(UserDao.class)
 8         // this.getClass().getGenericSuperclass()——当前运行类的父类(BaseDao<T>,以为User为例,那就是BaseDao<User>)
 9         Type type = this.getClass().getGenericSuperclass(); // generic 泛型
10         if(type instanceof ParameterizedType){
11             // 强制转化“参数化类型”
12             ParameterizedType parameterizedType = (ParameterizedType) type;
13             // 参数化类型中可能有多个泛型参数
14             Type[] types = parameterizedType.getActualTypeArguments();
15             // 获取数据的第一个元素(User.class)
16             clazz = (Class<T>) types[0]; // com.oa.shore.entity.User.class
17         }
18     }

说明:如果你的SessionFactory是手动的形式交给spring容器注入,那么,上面的问题还是解决不了;想要解决此问题,得 extends HibernateDaoSupport 它,让spring容器自动去管理/注入,即可解决此问题。可参考以下BaseDao实现类的全部代码

 1 package com.oa.common.dao.impl;
 2
 3 import java.lang.reflect.ParameterizedType;
 4 import java.lang.reflect.Type;
 5 import java.util.List;
 6
 7 import org.hibernate.Query;
 8 import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
 9 import org.springframework.stereotype.Repository;
10
11 import com.oa.common.dao.IBaseDao;
12
13 /**
14  * @author DSHORE/2020-2-6
15  *
16  */
17 @Repository("baseDao")
18 public class BaseDao<T> extends HibernateDaoSupport implements IBaseDao<T>  {
19     /* //此处交给spring自动管理/注入了(extends HibernateDaoSupport)
20     @Autowired
21     private SessionFactory sessionFactory;
22
23     public void setSessionFactory(SessionFactory sessionFactory) {
24         this.sessionFactory = sessionFactory;
25     }*/
26
27     private Class<T> clazz;
28
29     //反射机制,获取对应的对象
30     @SuppressWarnings("unchecked")
31     public BaseDao() {//构造函数的作用:获取对应的实体类对象
32         // this——表示当前类(UserDao)
33         // this.getClass()——当前运行类的字节码(UserDao.class)
34         // this.getClass().getGenericSuperclass()——当前运行类的父类(BaseDao<T>,以为User为例,那就是BaseDao<User>)
35         Type type = this.getClass().getGenericSuperclass(); // generic 泛型
36         if(type instanceof ParameterizedType){
37             // 强制转化“参数化类型”
38             ParameterizedType parameterizedType = (ParameterizedType) type;
39             // 参数化类型中可能有多个泛型参数
40             Type[] types = parameterizedType.getActualTypeArguments();
41             // 获取数据的第一个元素(User.class)
42             clazz = (Class<T>) types[0]; // com.oa.shore.entity.User.class
43         }
44     }
45
46     @Override //新增
47     public int add(T entity) {
48         return (Integer) getHibernateTemplate().save(entity);
49         //return (Integer) sessionFactory.getCurrentSession().save(entity);
50     }
51
52     @SuppressWarnings("unchecked")
53     @Override //查询所有
54     public List<T> listAll() {
55         //Query query = sessionFactory.getCurrentSession().createQuery("from " + clazz.getSimpleName());
56         Query query = getSession().createQuery("from " + clazz.getSimpleName()); //这里用clazz.getName()也行
57         return query.list();
58     }
59 }

测试结果图:

此SSH注解版项目的所有代码(可参考):正在撰写另一篇文章(整理好 明天再发布)


原创作者:DSHORE

作者主页:http://www.cnblogs.com/dshore123/

原文出自:https://www.cnblogs.com/dshore123/p/12331195.html

欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

原文地址:https://www.cnblogs.com/dshore123/p/12331195.html

时间: 2024-11-10 20:12:05

错误/异常:java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType 的解决方法的相关文章

异常整理—HQL in 关键字查询 报出“Ljava.lang.Long; cannot be cast to java.lang.Long“异常

HQL in 关键字查询 报出"Ljava.lang.Long; cannot be cast to java.lang.Long"异常. 传入参数 Long[]类型:userIds Long类型:rid Query q = getSession().createQuery("select user from User user join user.roles as role where role.id <>:ridand user.id not in( :uid

2类型转换异常:Exception in thread &quot;main&quot; java.lang.ClassCastException:java.lang.Object cannot be cast to java.lang.Integer

public class TestException {    public static void main(String[] args) {        Object obj = new Integer(1);        int i =(Integer)(obj);        System.out.println(i);                Object object = new Object();        if (object instanceof Integer

weblogic11_64下的java.lang.ClassCastException: java.sql.Timestamp cannot be cast to java.sql.Date

项目需要切换服务器,从server2003切换到server2008上,新环境用的weblogic11_64.Oracle11g 项目部署运行之后,其他一切正常,只有涉及到查询date类型的数据库字段时,会报以下错误: java.lang.ClassCastException: java.sql.Timestamp cannot be cast to java.sql.Date 按照一般思路,这个异常,是代码中存在类型的强制转换,只要把强制转换的地方修改成合理的类型转换逻辑就可以了. 但是考虑到

数据转换bug花了半天时间 Java.math.BigDecimal cannot be cast to java.lang.String

从数据库取出一个 Count函数 统计的值 在代码中要转成Integer类型的时候 Integer.parseInt((String)map.get("ID_")) 报了一下错误: Java.math.BigDecimal cannot be cast to java.lang.String 解决方法: Object ob = map.get("ID_");先将数据转成 Integer.parseInt(ob.toString()); http://blog.csd

java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType

DAO层有很多操作其实可以用范式加反射来实现的,所以我就开始构想我的万金油BaseDAO了. BaseHibernateDaoAdvance.java public class BaseHibernateDaoAdvance<T extends ModifyInfoEntity, PK extends Serializable, DTO extends BaseDto> extends HibernateDaoSupport implements BaseDaoAdvance<T, PK

java.math.BigDecimal cannot be cast to java.lang.String &nbsp; ----解决方案

今天在开发的时候遇到了一个问题,在此记录一下,问题的大概意思就是类型不一致不能进行强转 代码如下: rolf.setFuncd((String) rece.get("FUN_CD"));//强转 rolf.setFunid((String) rece.get("FUN_ID")); //强转 rolf.setFunnm((String) rece.get("FUN_NM")); //强转 因为我第二段的代码Orc数据库的字段类型是number,而

报错:java.lang.Long cannot be cast to java.lang.Integer

Long 无法转化成Integer类型. 这个异常 经常出现在hinbernate分页查询的时候. 原因: 这里在Hibernate2.0之前版本list.get(0)返回的是Integer类型. 但是在Hibernate3.0以后版本list.get(0)返回的是Long类型. 解决方法 public Integer getUsersCount() { String hql = "select count(*) from Users"; List list = super.pageQ

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

1.错误描写叙述 java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String service.impl.ArrivalBillServiceImpl.exportBillExcel(BillServiceImpl.java:266) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.Na

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map

1.错误描述 java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map at service.impl.BillServiceImpl.exportBillExcel(BillServiceImpl.java:336) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMet