在DAO层中使用泛型,会碰到要取得泛型类型的问题,
public class BaseDao<T> extends HibernateDaoSupport implements IBaseDao<T>{
为了取得的类型所用的方法有两种
1、用一方法完成
public Class<T> getClz(){
if(clz==null){
clz =(Class<T>) (((ParameterizedType)(this.getClass().getGenericSuperclass())).getActualTypeArguments()[0]);
}
return clz;
}
2、写一个工具类完成
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class GenericsUtils {
public static Class getSuperClassGenricType(Class clazz) {
return getSuperClassGenricType(clazz, 0);
}
public static Class getSuperClassGenricType(Class clazz, int index) throws IndexOutOfBoundsException {
Type genType = clazz.getGenericSuperclass();
if (!(genType instanceof ParameterizedType)) {
System.out.println("genTyp 不是泛型");
return Object.class;
}
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
if (index >= params.length || index < 0) {
System.out.println("params的index超标");
return Object.class;
}
if (!(params[index] instanceof Class)) {
System.out.println("params的index不是Class");
return Object.class;
}
return (Class) params[index];
}
}
然后在类中使用方法:
public Class<T> getClz(){
System.out.println(clz==null);
clz =(Class<T>)GenericsUtils.getSuperClassGenricType(this.getClass(),0);
System.out.println(clz);
return clz;
}
但是,有时还会出现
Exception in thread "main" org.hibernate.MappingException: Unknown entity: java.lang.Object
的错误,原以为是方法问题,调试后发现问题发生在继承这个类的子类的泛型的标记使用上。
如下:
public class BaseDao<T> extends HibernateDaoSupport implements IBaseDao<T>
public interface IBaseDao<T>
public interface ICityDao extends IBaseDao<City>
public class CityHibernateDao extends BaseDao<City> implements ICityDao
这类的和子类的所加的地方是有区别的,不是所有的类都要加<>的,如果加了,那泛型就找不到真实的city类型,而返回java.lang.Object
引发错误。