bow*_*sie 11 java generics reflection derived-class
我有一个参数化的hibernate dao执行基本的crud操作,并且当参数化被用作委托来完成给定dao的基本crud操作时.
public class HibernateDao <T, ID extends Serializable> implements GenericDao<T, ID>
Run Code Online (Sandbox Code Playgroud)
我希望能够在运行时从T派生Class以在Hibernate中创建条件查询,这样:
public T findByPrimaryKey(ID id) {
return (T) HibernateUtil.getSession().load(T.getClass(), id);
}
Run Code Online (Sandbox Code Playgroud)
我知道:
T.getClass()
Run Code Online (Sandbox Code Playgroud)
不存在,但有没有办法在运行时从T派生正确的Class对象?
我看过泛型和反思,但没有找到合适的解决方案,也许我错过了一些东西.
谢谢.
Ada*_*ter 17
您可以将类作为构造函数参数传递.
public class HibernateDao <T, ID extends Serializable> implements GenericDao<T, ID> {
private final Class<? extends T> type;
public HibernateDao(Class<? extends T> type) {
this.type = type;
}
// ....
}
Run Code Online (Sandbox Code Playgroud)
有如何使用反射计算出class类型参数的T方法:
private Class<T> persistentClass = (Class<T>)
((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
Run Code Online (Sandbox Code Playgroud)
以下是我使用它的方式:
public class GenericDaoJPA<T> implements GenericDao<T> {
@PersistenceContext
protected EntityManager entityManager;
protected Class<T> persistentClass = figureOutPersistentClass();
private Class<T> figureOutPersistentClass() {
Class<T> clazz = (Class<T>)((ParameterizedType) (getClass().getGenericSuperclass())).getActualTypeArguments()[0];
log.debug("persistentClass set to {}", clazz.getName());
return clazz;
}
public List<T> findAll() {
Query q = entityManager.createQuery("SELECT e FROM " + persistentClass.getSimpleName() + " e");
return (List<T>) q.getResultList();
}
}
Run Code Online (Sandbox Code Playgroud)
我想这只适用于你ConcreteEntityDao是直接超类的时候HibernateDao<ConcreteEntity,...>.
我在这里找到了它:www.greggbolinger.com/blog/2008/04/17/1208457000000.html