获取泛型的真实类型,分为如下两种形式:java
假设,咱们有一个Generic<T>
类和Main
类code
class Generic<T> { } public class Main extends Generic<String> { }
如何在Main类中获取到父类泛型的实际类型呢?继承
能够经过以下方式获取:get
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> { }
如何获取到当前类上的泛型呢?io
能够经过以下方式获取到定义在类上的泛型名称,下面代码会打印出T。编译
public class Person<T> { public static void main(String[] args){ TypeVariable[] parameters = Person.class.getTypeParameters(); for (TypeVariable typeVariable : parameters) { System.out.println(typeVariable); } } }
可是,咱们要获取像下面代码中的泛型,暂时没有找到解决方案class
Person<String> person = new Person<>();
不过,经过查看编译后的字节码文件,发现类型信息保留在字节码中,能够经过字节码反推的形式获取到,那就很复杂了。test
对于在字段上,复杂形式的泛型,咱们能够经过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
源码中的示例。