直接上代码
public class ParameterizedTypeUtils {
public static Class> get(Class> clazz,int index){
ParameterizedType aClass = (ParameterizedType) clazz.getGenericSuperclass();
Type[] actualTypes = aClass.getActualTypeArguments();
return ((Class>) actualTypes[index]);
}
public static Class> getByType(Class> clazz,Class> type){
ParameterizedType aClass = (ParameterizedType)clazz.getGenericSuperclass();
Type[] actualTypes = aClass.getActualTypeArguments();
for (Type actualType : actualTypes) {
Class> actual = ((Class>) actualType);
if (type.isAssignableFrom(actual)) {
return actual;
}
}
return null;
}
}
使用方法
- 根据索引
Listlist = new List(); ParameterizedTypeUtils.get(list.getClass(),0) // String
- 根据类型
class Person{}
class ZhangSan{}
class A{}
A a = new A();
ParameterizedTypeUtils.get(a.getClass(),Person.class) // ZhangSan
这里注意,不要获取未实例化对象的类的泛型,会直接得出泛型本身
例如泛型为 T, 那也只能获取到 T,不会是某个具体类型。
class A{} ParameterizedTypeUtils.get(A.class,0) // T



