ITPub博客

首页 > 数据库 > 数据库开发技术 > 超实用懒人必备 Spring 工具类泛型处理 ResolvableType

超实用懒人必备 Spring 工具类泛型处理 ResolvableType

原创 数据库开发技术 作者:DevXTalk 时间:2024-01-24 08:30:00 0 删除 编辑

超实用懒人必备 Spring 工具类泛型处理 ResolvableType

工作多年我发现一个有趣的现象,有的同学会在项目代码中自己去写很多基础代码,比如使用 JDK 提供的 I/O API  等等。 我不是说这样做不好,只是没必要(good but wrong , 你是个好人...),尤其是在商业项目中。 首先这样做并不能让我们的效率提高,其次自己编写的代码也许并没有开源项目质量高, 最重要的一点是这样做真的会让自己很累。我是不大理解为什么很多公司招聘的时候都要写上要求能吃苦耐劳, 当然了吃苦耐劳本身并没有错能表现出一个人的坚强的意志力。但也不适用于所有的场景,就像事实证明人多不一定力量大。 换个角度想与其吃苦耐劳我们能不能偷懒呢,想想有没有更聪明,高效的办法让我们完成工作呢。做一个懒惰的程序员,但前提是做一个 聪明且懒惰的程序员。

ResolvableType 简介

泛型自 Java 5 诞生,为了支持泛型,Java 5 新增了 Type 类,表示 Java 中的某一种类型,反射包中提供的获取泛型类型的方法中多是返回 Type 类型,使用时需要进行强制类型转换, 为了简化对泛型信息的获取,Spring 4 开始提供了一个 org.springframework.core.ResolvableType 用来处理泛型相关操作。

ResolvableType 实例化

使用 ResolvableType,需要先获取其实例,泛型类型可以存在于类、成员变量、构造器参数、成员方法参数、方法返回值,对应于这些泛型类型可以存在的位置,ResolvableType 提供了一些将这些泛型类型信息转换为 ResolvableType 的静态方法,常见的方法如下。

public class ResolvableType implements Serializable {

// 根据原始类型 Class 创建 ResolvableType
public static ResolvableType forClass(@Nullable Class<?> clazz);

// 根据构造器参数创建 ResolvableType
public static ResolvableType forConstructorParameter(Constructor<?> constructor, int parameterIndex);

// 根据成员变量创建 ResolvableType
public static ResolvableType forField(Field field);

// 根据实例创建 ResolvableType
public static ResolvableType forInstance(Object instance);

// 根据方法参数创建 ResolvableType
public static ResolvableType forMethodParameter(Method method, int parameterIndex);

// 根据方法的返回值创建 ResolvableType
public static ResolvableType forMethodReturnType(Method method);

// 根据原始类型信息创建 ResolvableType
public static ResolvableType forRawClass(@Nullable Class<?> clazz);

// 根据某一种类型创建 ResolvableType
public static ResolvableType forType(@Nullable Type type);
}

ResolvableType 获取泛型

public class ResolvableType implements Serializable {

// 获取泛型数组的元素类型
public ResolvableType getComponentType();

// 获取泛型的实际类型,索引位置从0开始
// 如取 HashMap<String, List<Integer>> 中的 Integer,参数可以为 {1,0}
public ResolvableType getGeneric(@Nullable int... indexes);
public ResolvableType[] getGenerics();

// 获取类型的接口
public ResolvableType[] getInterfaces();

// 获取指定嵌套级别的 类型,嵌套级别从 1 开始
// 如取 HashMap<String, List<Integer>> 中的 List<Integer> 参数可取 1,{2:1}
public ResolvableType getNested(int nestingLevel);
public ResolvableType getNested(int nestingLevel, @Nullable Map<Integer, Integer> typeIndexesPerLevel);

// 获取原始类型
public Class<?> getRawClass();

// 获取父类型
public ResolvableType getSuperType();

// 获取当前实例表示的类型
public Type getType();

// 当前实例是否包含泛型参数
public boolean hasGenerics();

// 当前实例是否为数组
public boolean isArray();

// 当前实例是否为给定参数的类型或父类型
public boolean isAssignableFrom(Class<?> other);
public boolean isAssignableFrom(ResolvableType other);

// 获取当前实例解析出的类
public Class<?> resolve();
public Class<?> resolveGeneric(int... indexes);
}

获取 Spring 容器中指定泛型类型的 bean


// type 是要获取的 bean 的类型
// generics 是 type 类型上的泛型类型
ResolvableType resolvableType = ResolvableType.forClassWithGenerics(type, generics);
String[] names = context.getBeanNamesForType(resolvableType);

for (String name : names) {
Object bean = context.getBean(name);
}

非常的轻松写意且优雅,不用自己再去写一堆代码了,一行代码即可搞定。为了让大家能偷懒摸鱼我也是操碎了心。


欢迎加入 DevXTalk 的技术交流群,在这里你可以和大佬们一起交流分享技术,行业经验,提升自我。总之期待你的加入...


「看完本文有收获?转发给更多的朋友吧」

「DevXTalk 不止于技术」

原文作者:DevXTalk;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2019-03-23

  • 博文量
    178
  • 访问量
    82575