Java中获取类声明泛型的Class对象(WEB开发Dao层的抽取)

在WEB开发中,用到三层架构中经常会遇到代码抽取的情况,例如在dao层中,我们需要对数据库的基本操作进行抽取例如这样,在抽取之前我们需要定义抽取类的接口:

public interface BaseDao<T> {
	
	public void save(T obj);
	public void delete(T obj);
	public void update(T obj);
	public List<T> getAll();
	public T getById(Serializable id);
	
}

接口定义玩后我们需要定义接口的实现类了:

public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T>{
	
	//该方法用于注解注入SessionFactory对象
     @Resource
	public void setMySessionFactory(SessionFactory sessionFactory) {
		super.setSessionFactory(sessionFactory);
	}



	@Override
	public void save(T obj) {
		this.getHibernateTemplate().save(obj);	
	}

	@Override
	public void delete(T obj) {
		this.getHibernateTemplate().delete(obj);
	}

	@Override
	public void update(T obj) {
		this.getHibernateTemplate().update(obj);
	}

	@Override
	public List<T> getAll() {
		String hql="from "+clazz.getSimpleName();
		List<T> list = (List<T>) this.getHibernateTemplate().find(hql);
		return list;
	}

	@Override
	public T getById(Serializable id) {
		
	}
}

在实现类中增、删、改的方法很容易实现,但由于HibernateTemplate的get方法必须传入目标对象的Class对象,也就是get(Class<?> clazz,Serializable),由于该类是使用泛型表示“需要查询的对象类型”,那我们如何获得该类泛型的Class对象成为了关键。(虽然getById()方法也可以像getAll()方法一样采用HQL查询,但我们为了演示这个问题,所以不采用这个方法)

public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T>{
	
	//该字段保存当前类泛型的Class对象
        private Class<T> clazz;
	
	
	
	public BaseDaoImpl() {

                //返回表示此 Class 所表示的实体的直接超类的 Type
		ParameterizedType genericSuperclass = (ParameterizedType)this.getClass().getGenericSuperclass();
                //获得本类声明的泛型数组(实际上只有一个)
		Type[] actualTypeArguments = genericSuperclass.getActualTypeArguments();
        
		clazz = (Class<T>)actualTypeArguments[0];
	}
    
	//为了简介,这里省略前面已经给出实现过程的方法
        ............

	@Override
	public T getById(Serializable id) {
		T t = this.getHibernateTemplate().get(clazz,id);
		return t;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听到微笑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值