您的位置:首页 > 其它

利用反射实现泛型的实现

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

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

       Base接口

public interface BaseDao<T>{
public Collection<T> 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<T> implements BaseDao<T>{
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];//<T>
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<T> 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<Department> implements DepartmentDao<Department>{

public void saveDepartment(Department department) {
// TODO Auto-generated method stub
this.saveEntry(department);
}
}        这几天就一直在研究这个人家是怎么封装的,因为以前就是会用,这次把这个好好的看一下,发现对这个代码的实现还是非常有帮组的,现在想想以前敲代码的过程,自己都有点忍不住笑话自己了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  泛型 反射