从Generic T派生类

时间:2009-04-29 11:33:07

标签: java generics reflection derived-class

我有一个参数化的hibernate dao,它执行基本的crud操作,并且当参数化被用作委托来完成给定dao的基本crud操作时。

public class HibernateDao <T, ID extends Serializable> implements GenericDao<T, ID>

我希望能够在运行时从T派生Class以在Hibernate中创建条件查询,这样:

public T findByPrimaryKey(ID id) {
    return (T) HibernateUtil.getSession().load(T.getClass(), id);
}

我知道:

T.getClass()

不存在,但有没有办法在运行时从T派生正确的Class对象?

我看过泛型和反思,但没有找到合适的解决方案,也许我错过了一些东西。

感谢。

2 个答案:

答案 0 :(得分: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;
    }

    // ....

}

答案 1 :(得分:7)

如何使用反射找出类型参数class的{​​{1}}:

T

以下是我使用它的方式:

private Class<T> persistentClass = (Class<T>)
    ((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];

我认为这仅适用于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(); } } ConcreteEntityDao的直接超类。

我在这里找到了它:www.greggbolinger.com/blog/2008/04/17/1208457000000.html