• 错误/异常: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注解版项目的完整代码(可参考):https://www.cnblogs.com/dshore123/p/12336358.html

    原创作者:DSHORE

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

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

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

  • 相关阅读:
    使用Stream流递归 组合树形结构
    MySQL 8 通用表表达式
    sa-token 权限认证
    先更新缓存还是先更新数据库?
    钉钉 回调事件 消息加解密
    commons-io
    stream和parallelstream的区别
    消除if...else
    springboot 扩展xml请求和响应
    springboot admin 邮箱
  • 原文地址:https://www.cnblogs.com/dshore123/p/12331195.html
Copyright © 2020-2023  润新知