spring · 25 4 月, 2021 0

Spring泛型处理

Java泛型基础

  • 泛型类型

    • 泛型类型是在类型上参数化的泛型类或接口

  • 泛型使用场景

    • 编译时强类型检查

    • 避免类型墙砖

    • 实现通用算法

  • 泛型类型擦写

    • 泛型被引入到Java语言中,以便在编译时提供更严格的类型检查并支持泛型编程。类型擦除确保不会为参数化类型创建新类。因此泛型不会产生运行时开销。为了实现泛型,编译器将类型擦除应用于:

      • 将泛型类型中的所有类型参数替换为其边界,如果类型参数是无界的 ,则将其替换为Object, 因此,生成的字节码只包含普通类,接口和方法。

      • 必要是插入类型转换以保持类型安全

      • 生成桥接方法以保留扩展泛型类型中的多态性。

Java 5 类型接口

  • Java 5 类型接口 – java.lang.reflect.LType

    派生类或接口 说明
    java.lang.CLass Java类API, 如 java.lang.String
    java.lang.reflect.GenericArrayType 泛型数组类型
    java.lang.reflect.ParameterizedType 泛型参数类型
    java.lang.reflect.TypeVariable 泛型类型变量, 如Collection<E>中的E
    java.lang.reflect.WildCardType 泛型通配类型
  • Java泛型API

    类型 API
    泛型信息(Generic Info) java.lang.Class#getGenericInfo()
    泛型参数(Parameters) java.lang.reflect.ParameterizedType
    泛型父类(Super Classes) java.lang.Class#getGenericSuperclass()
    泛型接口(Interfaces) java.lang.Class#getGenericInterfaces()
    泛型声明(Generics Declaration) java.lang.reflect.GenericDeclaration

    Spring泛型辅助类

    • 核心API – org.springframework.core.GenericTypeResolver

      • 版本支持:[2.5.2, )

      • 处理类型相关(Type)相关方法

        • resolveReturnType

        • resolveType

      • 处理泛型参数类型(ParameterizedType)相关方法

        • resolveReturnTypeArgument

        • resolveTypeArgument

        • resolveTypeArguments

      • 处理泛型类型变量(TypeVariable) 相关方法

        • getTypeVariableMap

Spring 泛型集合类型辅助类

  • 核心API – GenericCollectionTypeResolver

    • 版本支持[2.0, 4.3]

    • 替换实现:ResolvableType

    • 处理Collection相关

      • getCollection*Type

    • 处理Map相关

      • getMapKey*Type

      • getMapValue*Type

Spring 方法参数封装

  • 核心API – org.springframework.core.MethodParameter

    • 其实版本:[2.0, )

    • 元信息

      • 关联的方法 – Method

      • 关键的构造器 – Constructer

      • 构造器和方法参数索引 – parameterIndex

      • 构造器或方法参数类型 – parameterType

      • 构造器或方法参数泛型类型 – genericParameterType

      • 构造器或方法参数参数名称- parameterName

      • 所在的类 – containingClass

Spring 4.0 泛型优化实现 – ResolvableType

  • 核心API – “org.springframework.core.ResolvableType

    • 起始版本:[4.0 )

    • 扮演角色:GenericTypeResolverGenericCollectionTypeResolve替代者

    • 工厂方法:for*方法

    • 转换方法:as*方法

    • 处理方法:resolve*方法

局限性

  • ResolvableType无法处理泛型擦写

  • ResolvableType无法处理非具体化的ParameterizedType