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< T extends Identifiable > {

  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< T extends Identifiable> implements Dao< T > {

  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) {

  public void delete(T obj) {

Then, all we have to do is extend from the class:

public class BookDaoHibernateImpl extends HibernateDao< Book > {


Tags: , ,