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

阅读: 评论:0

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

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

文章目录

    • 背景
    • ResolvableType 的使用
      • 获取父类的泛型
      • 获取接口上的泛型
      • 获取属性上的泛型
        • 获取属性对象的泛型
        • 获取属性List上的泛型
        • 获取属性List嵌套List的泛型
        • 获取属性Map上的泛型
      • 获取方法返回值的泛型
      • 获取构造方法参数的泛型
    • 参考

这里是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> {}
  • 获取方式
	@Testpublic void getPersonGenericBySpring() {ResolvableType resolvableType = ResolvableType.forClass(Student.class);for (ResolvableType generic : SuperType().getGenerics()) {System.out.solve());}}
  • 运行结果

获取接口上的泛型

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

获取属性上的泛型

测试类

@Datastatic 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) {}}
获取属性对象的泛型
  • 获取方式
    @Testpublic void getPropertyGeneric() {ResolvableType resolvableType = ResolvableType.forField(ReflectionUtils.findField(GenericClass.class, "person"));for (ResolvableType generic : Generics()) {System.out.solve());}}
  • 运行结果
获取属性List上的泛型
  • 获取方式
    @Testpublic void getPropertyListsGeneric() {ResolvableType resolvableType = ResolvableType.forField(ReflectionUtils.findField(GenericClass.class, "listString"));for (ResolvableType generic : Generics()) {System.out.solve());}}
  • 获取结果
获取属性List嵌套List的泛型
  • 获取方式
    @Testpublic void getPropertyListAndListGeneric() {ResolvableType resolvableType = ResolvableType.forField(ReflectionUtils.findField(GenericClass.class, "listLists"));ResolvableType generic1 = Generic(0);// 第一层System.out.println("第一层泛型: " + solve());// 第二层ResolvableType generic = Generic(0);System.out.println("第二层泛型: " + solve());Class<?> resolve = Generic(0, 0).resolve();// 也可以使用如下方式获取System.out.println("第二层泛型: " + resolve);}
  • 结果
获取属性Map上的泛型
  • 获取方式
    @Testpublic void getPropertyMapGeneric() {ResolvableType resolvableType = ResolvableType.forField(ReflectionUtils.findField(GenericClass.class, "maps"));for (ResolvableType generic : Generics()) {System.out.solve());}}
  • 获取结果

获取方法返回值的泛型

  • 获取方式
    @Testpublic void getMethodGeneric() {ResolvableType resolvableType =ResolvableType.forMethodReturnType(ReflectionUtils.findMethod(GenericClass.class, "method"));// 第一层for (ResolvableType generic : Generics()) {System.out.println("Map中的泛型: " + solve());}// 获取第二层的System.out.println("Map中List的泛型: " + Generic(1, 0).resolve());}
  • 获取结果

获取构造方法参数的泛型

  • 获取方式
    @Testpublic void getConstructorGeneric() {ResolvableType resolvableType =ResolvableType.ConstructorIfAvailable(GenericClass.class, List.class, Map.class), 1);for (ResolvableType generic : Generics()) {System.out.println("构造方法参数泛型: " + solve());}System.out.println("Map中的泛型: " + Generic(1, 0).resolve());}
  • 获取结果

参考

博客

本文发布于:2024-01-28 04:04:41,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17063858974643.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:你对   幻想   操作   Spring   ResolvableType
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23