Using runtime generic type reflection to build a smarter DAO
- by kerry
Have you ever wished you could get the runtime type of your generic class? I wonder why they didn’t put this in the language. It is possible, however, with reflection:
Consider a data access object (DAO) (note: I had to use brackets b/c the arrows were messing with wordpress):
public interface Identifiable {
public Long getId();
}
public interface Dao {
public T findById(Long id);
public void save(T obj);
public void delete(T obj);
}
Using reflection, we can create a DAO implementation base class, HibernateDao, that will work for any object:
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
public class HibernateDao implements Dao {
private final Class clazz;
public HibernateDao(Session session) {
// the magic
ParameterizedType parameterizedType = (ParameterizedType) clazz.getGenericSuperclass();
return (Class) parameterizedType.getActualTypeArguments()[0];
}
public T findById(Long id) {
return session.get(clazz, id);
}
public void save(T obj) {
session.saveOrUpdate(obj);
}
public void delete(T obj) {
session.delete(obj);
}
}
Then, all we have to do is extend from the class:
public class BookDaoHibernateImpl extends HibernateDao {
}