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;
}
}

浙公網安備 33010602011771號