看到一些项目的BaseDaoImpl里常常使用泛型来反向获得当前的实体类。代码片段如下:
public class BaseDaoImpl <T,PK extends Serializable> implements BaseDao<T, PK>
@SuppressWarnings("unchecked")
public BaseDaoImpl(){
this.entityClass = null;
Class<?> c = getClass();
Type t = c.getGenericSuperclass();
if (t instanceof ParameterizedType) {
Type[] p = ((ParameterizedType) t).getActualTypeArguments();
this.entityClass = (Class<T>) p[0];
System.out.println(this.entityClass.getName());
}
}
该方法使用了java的反射机制获得直接父类type,再通过getActualTypeArguments()获得type对象的数组(例子中p[0]表示T,p[1]表示PK)的第一个元素,从而获得泛型参数的实际类型