title: 策略模式+反射泛型参数的应用
id: 20240531165426
aliases:
date: 2024-05-31 16:54:26
tags:
- 泛型
- 策略模式实践
- ConversionService
- Spring转换器
- 反射
需求
- 有一个泛型接口,接口中有一个方法,入参是泛型
- 泛型的具体类型由子类确定;可能是Double/LocalDateTime/String 等
- 前端来的数据都是String,不想让前端去做过多的处理
这里其实就是用了一个策略模式,接口定义了方法;子类去指定具体的类型,并进行处理
难点
- String ==> Double/LocalDateTime/ BigDecimal 都需要写转换逻辑
可以利用Spring 的 ConversionService 实现,具体可以参考 [YourBatman大佬的文章](#[YourBatman]-Spring类型转换 (qq.com)) - 每个实现类的转换代码都差不多,只有T.class 不同;那有没有办法获取到 具体的Class
通过反射可以拿到 泛型的具体Class
解决方案
难点1
可以很方便的使用 Spring提供的 ConversionService,故不累述
难点2:如何拿到 泛型的具体 class 实例
Java 反射相关前置知识
- Type 、Class 、ParameterizedType 的关系
- Class Java类的抽象
- ParameterizedType 可以理解为包含了泛型信息的class;
- Type 是 上述两个实现类的接口;关系如下图
clazz.getGenericSuperclass()
可以拿到父类的 Type(可能是Class,也有可能是ParameterizedType) 实例对象clazz.getGenericInterfaces()
可以拿到父接口的 Type 实例对象- 可以通过
ParameterizedType.getActualTypeArguments()
实例对象获取到泛型的具体信息