由于java 泛型擦除机制,无法通过反射直接获取泛型的类型。但是,Java反射可以通过class获取父类泛型类型
泛型被擦除Demo:
public class Test {
public static void main(String[] args) throws Exception {
List<Integer> integerList=new ArrayList();
integerList.add(1);
//泛型被擦除
integerList.getClass().getMethod("add",Object.class).invoke(integerList,"test");
//会打印出test
System.out.println(integerList.get(1));
}
}
通过反射获取父类的泛型类型 Demo
Dao.java
public abstract class Dao<T> {
public T get(Long id) {
return null;
}
public T save(T data) {
return null;
}
}
StudentDao.java
public class StudentDao extends Dao<Student>{
}
public class Test {
public static void main(String[] args) throws Exception {
StudentDao studentDao = new StudentDao();
Class clszz = getSuperClassGenericType(studentDao.getClass(), 0);
//打印出泛型类型
System.out.println(clszz);
}
public static Class getSuperClassGenericType(Class clazz, int index) {
if (clazz == null || index < 0) {
return Object.class;
}
Type genType = clazz.getGenericSuperclass();
if (!(genType instanceof ParameterizedType)) {
return Object.class;
}
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
if (params == null || params.length <= index) {
return Object.class;
}
if (!(params[index] instanceof Class)) {
return Object.class;
}
return (Class) params[index];
}
}