代码
import cn.hutool.core.util.ArrayUtil;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class ClassUtils {
/**
* 查找泛型类类型。
* @param klass 类的Class对象
* @param paramIndex 参数索引,从0开始。
* @return 泛型类类型,如果未找到则返回null。
*/
public static Class findParameterizedClass(Class klass, int paramIndex) {
ParameterizedType parameterizedType = getParameterizedType(klass, 1);
if (parameterizedType == null) {
return null;
}
//泛型参数类型
Type[] params = parameterizedType.getActualTypeArguments();
if (ArrayUtil.isEmpty(params) || params.length <= paramIndex) {
return null;
}
Class clazz = getClazz(params[paramIndex], 1);
return clazz;
}
/**
* 递归获取 ParameterizedType-泛型类型
*
*/
private static ParameterizedType getParameterizedType(Type type, int deep){
if (deep > 30) {
throw new IllegalStateException("递归过深,请检查代码");
}
//泛型类型
if(type instanceof ParameterizedType) {
return (ParameterizedType) type;
} else if (type instanceof Class) {
return getParameterizedType((((Class<?>) type).getGenericSuperclass()), deep + 1);
} else {
return null;
}
}
/**
* 递归获取 Class
*/
private static Class getClazz(Type type, int deep) {
if (deep > 30) {
throw new IllegalStateException("递归过深,请检查代码");
}
//泛型类型
if(type instanceof ParameterizedType) {
Type rawType = ((ParameterizedType) type).getRawType();
return getClazz(rawType, deep + 1);
}else{
return (Class) type;
}
}
}
使用效果
获取ExcelTaskServiceImpl第一个和第二个泛型类的class
测试代码
Class<ExcelTaskMapper> param1Clazz = ClassUtils.findParameterizedClass(ExcelTaskServiceImpl.class, 0);
System.out.println(param1Clazz);
Class<ExcelTask> param2Clazz = ClassUtils.findParameterizedClass(ExcelTaskServiceImpl.class, 1);
System.out.println(param2Clazz.getName());
效果