获取泛型的真实类型,分为以下两种形式:

1、获取类的泛型的真实类型

假设,我们有一个Generic<T>类和Main

class Generic<T> {  } public class Main extends Generic<String> {  }

如何在Main类中获取到父类泛型的实际类型呢?

可以通过如下方式获取:

class Generic<T> {  }  public class Main extends Generic<String> {      public static void main(String[] args) {         // 具体参数类型         Main testClass = new Main();         System.out.println(getGenericType(testClass.getClass()));     }     /**      * 获取所继承类的泛型实际类型      *      * @param declaredClass 传入Class实例      * @return 泛型实际类型      */     private static Class getGenericType(Class declaredClass) {         ParameterizedType parameterizedType = (ParameterizedType) declaredClass.getGenericSuperclass();         Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();         return (Class) actualTypeArguments[0];     }  }

还有另一种情况,我们有一个Person<T>

public class Person<T> {  }

如何获取到当前类上的泛型呢?

可以通过如下方式获取到定义在类上的泛型名称,下面代码会打印出T。

public class Person<T> {      public static void main(String[] args){         TypeVariable[] parameters = Person.class.getTypeParameters();         for (TypeVariable typeVariable : parameters) {             System.out.println(typeVariable);         }     }  }

但是,我们要获取像下面代码中的泛型,暂时没有找到解决方案

Person<String> person = new Person<>();

不过,通过查看编译后的字节码文件,发现类型信息保留在字节码中,可以通过字节码反推的形式获取到,那就很复杂了。

2、获取类字段上泛型的真实类型

对于在字段上,复杂形式的泛型,我们可以通过Spring-core中的ResolvableType类帮助我们解析。

public class Main {      private List<Map<String, List<Object>>> list = new ArrayList<>();      public static void main(String[] args) throws NoSuchFieldException {         // 获取成员泛型参数类型         Field field = Main.class.getDeclaredField("list");         ResolvableType resolvableType = ResolvableType.forField(field);         System.out.println(resolvableType.getGeneric(0));     }  }

具体使用可以查看ResolvableType源码中的示例。

转载于:https://my.oschina.net/u/3226414/blog/3004371