利用反射实现泛型的实现

         前三篇博客,有两篇分别是反射和泛型,但是在做网上商城的时候,见里边用到了BaseDao,里边也都是一些基本的增删该查的方法,但是有一点,如果我们调用底层的方法,就需要知道我们穿进去的是一个具体的说明类,这样的话才能根据实体去查询,还有就是我们要在BaseImpl中获得参数的实例,所以这个都是我们需要去实现的。但是如果我们写一个T t = new T(),程序一定会报错,那么我们要怎么写呢。

       首先我们学习反射和泛型都是为了解耦合,提高代码的复用性,所以当我们把两者结合起来的时候,就是这个样子了,代码如下:

       Base接口

public interface BaseDao{
	public Collection getAllEntry();
	public T getEntryById(Serializable id);
	public void saveEntry(T t);
	public void updateEntry(T t);
	public void deleteEntry(Serializable id);
}

     Base的实现

public class BaseDaoImpl implements BaseDao{
	private Class classt;
	/**
	 * 1、在父类中要执行一段代码,这个代码的执行时间为子类创建对象的时候,这段代码已经执行完了,根据这个需求,有两种方案供选择
	 *      *  利用static语句块
	 *      *  利用父类的构造函数
	 * 2、分析:
	 *      因为得到ParameterizedType需要用到this关键字,而this关键字不能出现在static语句块中
	 *    所以只能选择父类的构造器
	 */
	public BaseDaoImpl(){
		/**
		 * ParameterizedType就是泛型
		 */
		ParameterizedType type = (ParameterizedType)this.getClass().getGenericSuperclass();
		this.classt = (Class)type.getActualTypeArguments()[0];//
		System.out.println(this.classt);
		System.out.println(type.getRawType() + "...................");
	}
	
	
	public HibernateTemplate hibernateTemplate;

	public HibernateTemplate getHibernateTemplate() {
		return hibernateTemplate;
	}

	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		this.hibernateTemplate = hibernateTemplate;
	}

	public Collection getAllEntry() {
		return this.hibernateTemplate.find("from "+this.classt.getName());
	}

	public T getEntryById(Serializable id) {
		
		return (T)this.hibernateTemplate.get(this.classt, id);
	}

	public void saveEntry(T t) {
		
		this.hibernateTemplate.save(t);
	}

	public void updateEntry(T t) {
		
		this.hibernateTemplate.update(t);
	}

	public void deleteEntry(Serializable id) {
		T t = this.getEntryById(id);
		this.hibernateTemplate.delete(t);
	}

}
        这样我们在我们的Dao层的实现就可以直接用力,例如:

public class DepartmentDaoImpl extends BaseDaoImpl implements DepartmentDao{

	public void saveDepartment(Department department) {
		// TODO Auto-generated method stub
		this.saveEntry(department);
	}
}
        这几天就一直在研究这个人家是怎么封装的,因为以前就是会用,这次把这个好好的看一下,发现对这个代码的实现还是非常有帮组的,现在想想以前敲代码的过程,自己都有点忍不住笑话自己了。

你可能感兴趣的:(java基础)