首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。