使用getGenericSuperclass()和getActualTypeArguments()将DAO做成泛型
package com.ponderingtech;
import java.lang.reflect.ParameterizedType;
public class Dao<T> {
Class<T> clz;
@SuppressWarnings("unchecked")
public Class<T> getEntityClass() {
if(clz == null) {
ParameterizedType type = (ParameterizedType)this.getClass().getGenericSuperclass();
clz = (Class<T>) type.getActualTypeArguments()[0];
}
return clz;
}
}
package com.ponderingtech;
public class Test extends Dao<Integer> {
@Override
public String toString() {
return "entityClass="+getEntityClass()+", entityName="+getEntityClass().getSimpleName();
}
public static void main(String[] args) {
Test t = new Test();
System.out.println(t);// 输出结果为entityClass=class java.lang.Integer, entityName=Integer
}
}
说明: getGenericSuperclass() 通过反射获取当前类表示的实体(类,接口,基本类型或void)的直接父类的Type,getActualTypeArguments()返回参数数组,getActualTypeArguments()[0] 即返回Dao中的泛型Integer。