Java 运行时获取泛型类泛型类型
代码示例
由于Java泛型擦除的特点, 当我们使用泛型类Class时, 无法直接知道泛型T的类型. 此时可以借助Java反射中Class.getGenericSuperclass()来获取到子类具体实现时所使用的真实类型
public class TypeParent<T, R> {
private Class<T> mTClass;
private Class<R> mRClass;
@SuppressWarnings("unchecked")
public TypeParent() {
Type t = getClass().getGenericSuperclass();
System.out.println("getClass() == " + getClass());
System.out.println("getClass().getSuperclass() == " + getClass().getSuperclass());
System.out.println("getClass().getGenericSuperclass() == " + t);
Type firType = ((ParameterizedType) t).getActualTypeArguments()[0];
System.out.println("((ParameterizedType) t).getActualTypeArguments()[0] == " + firType);
Type secType = ((ParameterizedType) t).getActualTypeArguments()[1];
System.out.println("((ParameterizedType) t).getActualTypeArguments()[1] == " + secType);
try {
mTClass = (Class<T>) firType;
mRClass = (Class<R>) secType;
} catch (ClassCastException e) {
e.printStackTrace();
}
System.out.println("getActualTypeArguments() length == " + ((ParameterizedType) t).getActualTypeArguments().length);
}
}
此时TypeParent为泛型类分别申明了泛型类型T与R
子类实现
public class TypeSub extends TypeParent<Integer, String> {}
public class Main {
public static void main(String[] args) {
new TypeClass();
}
}
运行结果:
getClass() == class TypeClass getClass().getSuperclass() == class TypeParent getClass().getGenericSuperclass() == TypeParent<java.lang.Integer, java.lang.String> ((ParameterizedType) t).getActualTypeArguments()[0] == class java.lang.Integer ((ParameterizedType) t).getActualTypeArguments()[1] == class java.lang.String
mTClass == class java.lang.Integer
mRClass == class java.lang.String
getActualTypeArguments() length == 2
解析
Type getGenericSuperclass()
返回当前类型父类的Type类. 若父类为泛型类则返回的为ParameterizedType 否则返回的为Class
Type[] getActualTypeArguments()
返回泛型类<>中的参数对应的Type类. 由此我们可以通过getActualTypeArguments()获取到的Type类型转化为泛型类型的Class类型
转载自:https://juejin.cn/post/6969565445603098638