工作多年我发现一个有趣的现象,有的同学会在项目代码中自己去写很多基础代码,比如使用 JDK 提供的 I/O API 等等。 我不是说这样做不好,只是没必要(good but wrong , 你是个好人...),尤其是在商业项目中。 首先这样做并不能让我们的效率提高,其次自己编写的代码也许并没有开源项目质量高, 最重要的一点是这样做真的会让自己很累。我是不大理解为什么很多公司招聘的时候都要写上要求能吃苦耐劳, 当然了吃苦耐劳本身并没有错能表现出一个人的坚强的意志力。但也不适用于所有的场景,就像事实证明人多不一定力量大。 换个角度想与其吃苦耐劳我们能不能偷懒呢,想想有没有更聪明,高效的办法让我们完成工作呢。做一个懒惰的程序员,但前提是做一个 聪明且懒惰的程序员。
泛型自 Java 5 诞生,为了支持泛型,Java 5 新增了 Type 类,表示 Java 中的某一种类型,反射包中提供的获取泛型类型的方法中多是返回 Type 类型,使用时需要进行强制类型转换,
为了简化对泛型信息的获取,Spring 4 开始提供了一个 org.springframework.core.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);
}
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);
}
// 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;如有侵权,请联系管理员删除。