Hibernate泛型Dao之二

    在hibernate中实现泛型DAO时,最大的一个难点就是获得泛型类型的class对象。

public class GenericHibernateDao<T extends Serializable, PK extends Serializable> extends HibernateDaoSupport implements GenericDao<T,PK>{
	  private Class<T> entityClass;   
	  
	    // 构造方法,根据实例类自动获取实体类类型   
	    public GenericHibernateDao() {
	        this.entityClass = null;
	        Class c = getClass();
	        Type t = c.getGenericSuperclass();
	        if (t instanceof ParameterizedType) {
	            Type[] p = ((ParameterizedType) t).getActualTypeArguments();
	            this.entityClass = (Class<T>) p[0];
	        }
	    }
}

 

这是泛型DAO的泛型实现类。我们的DAO类可以继承自这个类。例如class UserDao extends GenericHibernateDao<UserBean , int>。当我们去实例化UserDao的时候,就会去自动调用GenericHibernateDao中的构造方法(子类会首先调用父类的构造方法)。下面我们来分析父类的构造方法,看看他是怎么获得UserBean类型的。

 

Class c = getClass();这一句。表面上看是获得GenericHibernateDao类的实例,但是应该是子类的实例。

c也就代表了子类的class对象。

Type t = c.getGenericSuperclass()。得到父类的类型。

t instanceof ParameterizedType。检查父类是否是泛型(即参数化类)

Type[] p = ((ParameterizedType) t).getActualTypeArguments()。如果是泛型,那么得到所有的泛型参数。

this.entityClass = (Class<T>) p[0]。得到第一个参数类型。也就是UserBean了。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值