这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党

背景

我们是否经常在写一些工具类或者SDK的时候需要获取类上面的泛型
比如父类的泛型,这样的

	static class Person<T, V> {      }      static class Student extends Person<String, Integer> {      } 

比如接口上的泛型

	interface StudentServiceImpl<T, V> {     }      static class StudentService implements StudentServiceImpl<String, Student> {     } 

等等一系列需要获取泛型的操作,但是Java的原生SDK还是比较难用和冗余的,所以Spring在
此背景下又扩展了Java 反射对泛型的操作,及ResolvableType类。下面我们一起来学习下吧

ResolvableType 的使用

获取父类的泛型

	static class Person<T, V> {}     static class Student extends Person<String, Integer> {} 
  • 获取方式
	@Test     public void getPersonGenericBySpring() {         ResolvableType resolvableType = ResolvableType.forClass(Student.class);         for (ResolvableType generic : resolvableType.getSuperType().getGenerics()) {             System.out.println(generic.resolve());         }     } 
  • 运行结果

Spring ResolvableType满足你对Java泛型的任何操作和幻想

获取接口上的泛型

	interface StudentServiceImpl<T, V> { }     static class StudentService implements StudentServiceImpl<String, Student> { } 
  • 获取方式
    @Test     public void getInterfaceBySpring() {         ResolvableType resolvableType = ResolvableType.forClass(StudentService.class);         for (ResolvableType anInterface : resolvableType.getInterfaces()) {             for (ResolvableType generic : anInterface.getGenerics()) {                 System.out.println(generic.resolve());             }         }     } 
  • 运行结果

Spring ResolvableType满足你对Java泛型的任何操作和幻想

获取属性上的泛型

测试类

@Data     static class GenericClass {         private List<String> listString;          private List<List<String>> listLists;          private Map<String, Long> maps;          private Person<String, Integer> person;          private HashMap<String, List<String>> method() {             return null;         }          public GenericClass(List<List<String>> list, Map<String, Map<String, Integer>> map) {         }     } 

获取属性对象的泛型

  • 获取方式
    @Test     public void getPropertyGeneric() {         ResolvableType resolvableType = ResolvableType.forField(ReflectionUtils.findField(GenericClass.class, "person"));         for (ResolvableType generic : resolvableType.getGenerics()) {             System.out.println(generic.resolve());         }     } 
  • 运行结果
    Spring ResolvableType满足你对Java泛型的任何操作和幻想

获取属性List上的泛型

  • 获取方式
    @Test     public void getPropertyListsGeneric() {         ResolvableType resolvableType = ResolvableType.forField(ReflectionUtils.findField(GenericClass.class, "listString"));         for (ResolvableType generic : resolvableType.getGenerics()) {             System.out.println(generic.resolve());         }     } 
  • 获取结果
    Spring ResolvableType满足你对Java泛型的任何操作和幻想

获取属性List嵌套List的泛型

  • 获取方式
    @Test     public void getPropertyListAndListGeneric() {         ResolvableType resolvableType = ResolvableType.forField(ReflectionUtils.findField(GenericClass.class, "listLists"));         ResolvableType generic1 = resolvableType.getGeneric(0);         // 第一层         System.out.println("第一层泛型: " + generic1.resolve());         // 第二层         ResolvableType generic = generic1.getGeneric(0);         System.out.println("第二层泛型: " + generic.resolve());         Class<?> resolve = resolvableType.getGeneric(0, 0).resolve();         // 也可以使用如下方式获取         System.out.println("第二层泛型: " + resolve);     } 
  • 结果
    Spring ResolvableType满足你对Java泛型的任何操作和幻想

获取属性Map上的泛型

  • 获取方式
    @Test     public void getPropertyMapGeneric() {         ResolvableType resolvableType = ResolvableType                 .forField(ReflectionUtils.findField(GenericClass.class, "maps"));         for (ResolvableType generic : resolvableType.getGenerics()) {             System.out.println(generic.resolve());         }     } 
  • 获取结果
    Spring ResolvableType满足你对Java泛型的任何操作和幻想

获取方法返回值的泛型

  • 获取方式
    @Test     public void getMethodGeneric() {         ResolvableType resolvableType =                 ResolvableType.forMethodReturnType(ReflectionUtils.findMethod(GenericClass.class, "method"));         // 第一层         for (ResolvableType generic : resolvableType.getGenerics()) {             System.out.println("Map中的泛型: " + generic.resolve());         }         // 获取第二层的         System.out.println("Map中List的泛型: " + resolvableType.getGeneric(1, 0).resolve());      } 
  • 获取结果
    Spring ResolvableType满足你对Java泛型的任何操作和幻想

获取构造方法参数的泛型

  • 获取方式
    @Test     public void getConstructorGeneric() {         ResolvableType resolvableType =                 ResolvableType.forConstructorParameter(ClassUtils.getConstructorIfAvailable(GenericClass.class, List.class, Map.class), 1);         for (ResolvableType generic : resolvableType.getGenerics()) {             System.out.println("构造方法参数泛型: " + generic.resolve());         }         System.out.println("Map中的泛型: " + resolvableType.getGeneric(1, 0).resolve());     } 
  • 获取结果
    Spring ResolvableType满足你对Java泛型的任何操作和幻想

参考

博客