public class GenericDAO<T> {
private Class<T> entityClass;
protected GenericDAO() {
//在子类实例化之前会将泛型填入(因为泛型是编译时期的),然后调用父类构造器,这时候我们可以通过一些特定的方法来获取这些实例化的泛型
//返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type
Type type = this.getClass().getGenericSuperclass();
Type type2 = (ParameterizedType) type;
//获取泛型实际类型参数 如<k,v> --> <Integer,String>这种类型 0 --> Integer
Type trueType = type2.getActualTypeArguments()[0];
//在这个例子里面获取的是MyEntity.class
this.entityClass = (Class<T>) trueType;
//其实class还有很多方法,如获取构造器,注解,类加载器等
}
}
//子类
public class MyEntityDao extends GenericDAO<MyEntity> {
}