获得超类的泛型参数在子类实例化传入的实际类型

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

}
原文地址:https://www.cnblogs.com/hirampeng/p/10410151.html