zoukankan      html  css  js  c++  java
  • 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, DTO> {
        
        private final Logger logger = LoggerFactory.getLogger(getClass());
        
        @Autowired
        private void getSessionFactory(SessionFactory sessionFactory){
            super.setSessionFactory(sessionFactory);
        }
        
        // 实体类类型(由构造方法自动赋值)
        private Class<T> entityClass;
        private Class<DTO> dtoClass;
        // 构造方法,根据实例类自动获取实体类类型
        public BaseHibernateDaoAdvance() {
            System.out.println("-------------->in BaseHibernateDaoAdvance");
            
            this.entityClass = null;
            Class c = getClass();
            System.out.println(c);
            Type t = c.getGenericSuperclass();
            System.out.println(t);
            if (t instanceof ParameterizedType) {
                System.out.println("in if");
                Type[] p = ((ParameterizedType) t).getActualTypeArguments();
                System.out.println(Arrays.toString(p));
                this.entityClass = (Class<T>) p[0];
                this.dtoClass = (Class<DTO>) p[2];
            }
        }
    }

    写好,准备些测试类

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = { "classpath:/config/applicationContext.xml",
    "classpath:/config/service.xml","classpath:/config/dao.xml" })
    public class BaseDAOImplAdvanceTest {
        
        
        private BaseDaoAdvance<Course, Serializable, CourseDTO> baseDAOImpl;
        
        
        public BaseDaoAdvance<Course, Serializable, CourseDTO> getBaseDAOImpl() {
            return baseDAOImpl;
        }
    
        @Autowired
        public void setBaseDAOImpl(
                BaseDaoAdvance<Course, Serializable, CourseDTO> baseDAOImpl) {
            this.baseDAOImpl = baseDAOImpl;
        }
    
    
        @Test
        public void queryList(){
            CourseDTO dto = new CourseDTO();
            baseDAOImpl.queryList(dto);
            System.out.println("here-------------------->");
        }
    }

    但是提示错误java.lang.NullPointerException

    了解一下代码,发现应该是这一段判断不通过

            if (t instanceof ParameterizedType) {
                System.out.println("in if");
                Type[] p = ((ParameterizedType) t).getActualTypeArguments();
                System.out.println(Arrays.toString(p));
                this.entityClass = (Class<T>) p[0];
                this.dtoClass = (Class<DTO>) p[2];
            }
    

     去掉if测试一下,还是报错,java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType

    ~~~~(>_<)~~~~

    其实原因是因为范式的使用方式不对。

    增加了具体的DAO和实现

    public interface CourseDao extends BaseDaoAdvance<Course, Serializable,CourseDTO> {
    
    }
    @Repository
    public class CourseDaoImpl extends BaseHibernateDaoAdvance<Course, Serializable,CourseDTO> implements CourseDao {
    
    }

    测试类

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = { "classpath:/config/applicationContext.xml",
    "classpath:/config/service.xml","classpath:/config/dao.xml" })
    public class CourseDaoImplTest {
    //    private BaseDaoAdvance<Course, Serializable, CourseDTO> baseDAOImpl;
        @Autowired
        private CourseDao courseDao;
    
        @Test
        public void queryList(){
    
            CourseDTO dto = new CourseDTO();
            courseDao.queryList(dto);
            System.out.println("here-------------------->");
        }
    }

    OK,成功!

    范式应该在编译的时候就指定,而不是运行时。

  • 相关阅读:
    如何在仪表板中播放视频
    根据条件显示表格背景色
    如何个性化设置柱形图(条形图)柱子粗细、圆角和颜色?
    如何设置报表参数的日期区间?
    妙用这3个函数,实现各种你意想不到的条件格式化
    利用组合图对数据按百分比区间进行对比展示的实例
    报表传参跳转到仪表板的实现过程
    Wyn仪表板中的图表,如何针对每个字段设置自定义颜色
    Wyn仪表板中设置完整数据格式的方法
    Wyn门户及仪表板颜色设置方式汇总
  • 原文地址:https://www.cnblogs.com/GaiDynasty/p/3938288.html
Copyright © 2011-2022 走看看