策略模式+反射泛型参数的应用


title: 策略模式+反射泛型参数的应用
id: 20240531165426
aliases:
date: 2024-05-31 16:54:26
tags:

  • 泛型
  • 策略模式实践
  • ConversionService
  • Spring转换器
  • 反射

需求

  • 有一个泛型接口,接口中有一个方法,入参是泛型
  • 泛型的具体类型由子类确定;可能是Double/LocalDateTime/String 等
  • 前端来的数据都是String,不想让前端去做过多的处理
    这里其实就是用了一个策略模式,接口定义了方法;子类去指定具体的类型,并进行处理
    image.png

难点

  1. String ==> Double/LocalDateTime/ BigDecimal 都需要写转换逻辑
    可以利用Spring 的 ConversionService 实现,具体可以参考 [YourBatman大佬的文章](#[YourBatman]-Spring类型转换 (qq.com))
  2. 每个实现类的转换代码都差不多,只有T.class 不同;那有没有办法获取到 具体的Class
    通过反射可以拿到 泛型的具体Class
    image.png

解决方案

难点1

可以很方便的使用 Spring提供的 ConversionService,故不累述

难点2:如何拿到 泛型的具体 class 实例
Java 反射相关前置知识
  • Type 、Class 、ParameterizedType 的关系
    • Class Java类的抽象
    • ParameterizedType 可以理解为包含了泛型信息的class;
    • Type 是 上述两个实现类的接口;关系如下图
      image.png
  • clazz.getGenericSuperclass() 可以拿到父类的 Type(可能是Class,也有可能是ParameterizedType) 实例对象
  • clazz.getGenericInterfaces() 可以拿到父接口的 Type 实例对象
  • 可以通过 ParameterizedType.getActualTypeArguments() 实例对象获取到泛型的具体信息
基于以上信息,我可以通过递归的方式不断去向上查找 父类/父接口 的泛型实例对象

image.png

测试

image.png

END

GitHub代码仓库

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值