从Java的Type到Spring的ResolvableType
Type
Type是Java编程语言中所有类型的公共高级接口。
Type体系包括以下:
- 原始类型(Class)
- 参数化类型(ParameterizedType)
- 数组类型(GenericArrayType)
- 类型变量(TypeVariable)
- 基本类型(Class)
ParameterizedType 参数化类型
ParameterizedType表示参数化类型,比如Collection<String>
但不限于集合, 还包括其他平常用到的范型类,比如Class<?>
1 | public interface ParameterizedType extends Type { |
GenericArrayType 数组类型
GenericArrayType表示其组件类型为参数化类型或类型变量的数组类型。比如T[]
,List<T>[]
它表示的是范型数组,而不是普通的String[]这样的数组
1 | public interface GenericArrayType extends Type { |
TypeVariable 类型变量
TypeVariable是用于类型变量的通用超接口。
它代表范型类型中的变量,即T、K、V
1 | public interface TypeVariable<D extends GenericDeclaration> extends Type, AnnotatedElement { |
Class 原始类型、基本类型
与上面三个不同的是,Class是Type的一个实现类,属于原始类型,是Java反射的基础。
在程序运行期间,每一个类都对应一个Class对象,这个对象包含了类基本信息。
ResolvableType
ResolvableType是Spring对Type家族的一个封装,用于简化范型的处理
ResolvableType的所有构造方法都是私有化的, 但是它提供了静态方法来构造。
forClass系列方法
直接封装指定的类型
forRawClass(Class<?> clazz)
调用构造方法,并重写了三个方法
1 | public static ResolvableType forRawClass(@Nullable Class<?> clazz) { |
forClass(Class<?> clazz)
直接调用构造方法
1 | public static ResolvableType forClass(@Nullable Class<?> clazz) { |
forClass(Class> baseType, Class> implementationClass)
传入基础类和实现类
1 | public static ResolvableType forClass(Class<?> baseType, Class<?> implementationClass) { |
forMethod系列方法
获取方法上的参数或返回值的类型信息
forMethodParameter(Method method, int parameterIndex)
传入方法, index=-1时返回方法返回值的类型, 1返回方法的第一个参数的类型,2返回第二个,以此类推
1 | public static ResolvableType forMethodParameter(Method method, int parameterIndex) { |
forMethodReturnType(Method method)
将方法的参数索引设为-1
1 | public static ResolvableType forMethodReturnType(Method method) { |
forField系列
用于处理字段的类型
forType(Type type, TypeProvider typeProvider, VariableResolver variableResolver)
系列方法会调用到这个核心方法
1 | static ResolvableType forType(@Nullable Type type, @Nullable TypeProvider typeProvider, @Nullable VariableResolver variableResolver) { |
总结
Spring提供的ResolvableType是对Java原生Type家族的一个封装,它包含了类、方法、字段、构造函数,当我们需要处理它们时,只需要调用响应的方法就能获取它们的ResolvableType,ResolvableType就包含了这个对象的所有类型信息