首页 > 代码库 > java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType

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> {}
@Repositorypublic 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,成功!

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

 

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