栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

背景

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

	static class Person {

    }

    static class Student extends Person {

    }

比如接口上的泛型

	interface StudentServiceImpl {
    }

    static class StudentService implements StudentServiceImpl {
    }

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

ResolvableType 的使用 获取父类的泛型
	static class Person {}
    static class Student extends Person {}
  • 获取方式
	@Test
    public void getPersonGenericBySpring() {
        ResolvableType resolvableType = ResolvableType.forClass(Student.class);
        for (ResolvableType generic : resolvableType.getSuperType().getGenerics()) {
            System.out.println(generic.resolve());
        }
    }
  • 运行结果

获取接口上的泛型
	interface StudentServiceImpl { }
    static class StudentService implements StudentServiceImpl { }
  • 获取方式
    @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());
            }
        }
    }
  • 运行结果

获取属性上的泛型

测试类

@Data
    static class GenericClass {
        private List listString;

        private List> listLists;

        private Map maps;

        private Person person;

        private HashMap> method() {
            return null;
        }

        public GenericClass(List> list, Map> map) {
        }
    }
获取属性对象的泛型
  • 获取方式
    @Test
    public void getPropertyGeneric() {
        ResolvableType resolvableType = ResolvableType.forField(ReflectionUtils.findField(GenericClass.class, "person"));
        for (ResolvableType generic : resolvableType.getGenerics()) {
            System.out.println(generic.resolve());
        }
    }
  • 运行结果
获取属性List上的泛型
  • 获取方式
    @Test
    public void getPropertyListsGeneric() {
        ResolvableType resolvableType = ResolvableType.forField(ReflectionUtils.findField(GenericClass.class, "listString"));
        for (ResolvableType generic : resolvableType.getGenerics()) {
            System.out.println(generic.resolve());
        }
    }
  • 获取结果
获取属性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);
    }
  • 结果
获取属性Map上的泛型
  • 获取方式
    @Test
    public void getPropertyMapGeneric() {
        ResolvableType resolvableType = ResolvableType
                .forField(ReflectionUtils.findField(GenericClass.class, "maps"));
        for (ResolvableType generic : resolvableType.getGenerics()) {
            System.out.println(generic.resolve());
        }
    }
  • 获取结果
获取方法返回值的泛型
  • 获取方式
    @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());

    }
  • 获取结果
获取构造方法参数的泛型
  • 获取方式
    @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());
    }
  • 获取结果
参考

博客

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/857613.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号