当前位置: 首页 > news >正文

java:类型变量(TypeVariable)解析--基于TypeResolver实现将类型变量替换为实际类型

上一篇博客《java:类型变量(TypeVariable)解析–获取泛型类(Generic Class)所有的类型变量(TypeVariable)的实际映射类型》中介绍如何如何正确解析泛型类的类型变量(TypeVariable),获取对应的实际类型。
有了类型变量(TypeVariable)–实际类型的映射,我们就可以基于guava的类型解析工具(com.google.common.reflect.TypeResolver)将一个类型(java.lang.reflect.Type)中所有类型变量的(TypeVariable)替换为实际类型。
以下是实现代码:
EnhancedTypeResolver.java

import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.Collections;
import java.util.Map;
import java.util.Map.Entry;
import com.google.common.base.MoreObjects;
import com.google.common.reflect.TypeResolver;import static com.google.common.base.Preconditions.checkNotNull;/*** 基于{@link TypeResolver}实现的类型变量({@link TypeVariable})解析工具<br>*/
public class EnhancedTypeResolver {private final TypeResolver typeResolver;/*** 构造方法* @param typeVariables 类型变量对应实际类型的映射,* 											参见 {@link net.gdface.utils.ReflectionUtils#getNormalizedTypeVariables(Class, boolean)}*/public EnhancedTypeResolver(Map<TypeVariable<?>, Type> typeVariables) {typeVariables = MoreObjects.firstNonNull(typeVariables, Collections.<TypeVariable<?>, Type>emptyMap());typeResolver = createTypeResolver(typeVariables);}public EnhancedTypeResolver() {this(Collections.<TypeVariable<?>, Type>emptyMap());}/*** 根据提供的类型变量-实际类型映射创建{@link TypeResolver}* @param typeVariables*/public static TypeResolver createTypeResolver(Map<TypeVariable<?>, Type> typeVariables) {TypeResolver _typeResolver = new TypeResolver();for(Entry<TypeVariable<?>, Type> entry:MoreObjects.firstNonNull(typeVariables, Collections.<TypeVariable<?>, Type>emptyMap()).entrySet()) {_typeResolver = _typeResolver.where(entry.getKey(), entry.getValue());}return _typeResolver;}/*** 解析类型中的所有类型变量,并返回已解析类型变量的对应类型。* @param type* @see TypeResolver#resolveType(Type)*/public Type resolveType(Type type) {return typeResolver.resolveType(type);}/*** 解析将数组中的类型中的所有类型变量,并返回已解析类型变量的对应类型数组。* @param types* @see TypeResolver#resolveType(Type)*/public Type[] resolveTypes(Type[] types) {Type[] resolved = checkNotNull(types,"types is null").clone();for(int i=0;i<resolved.length;++i) {resolved[i] = resolveType(resolved[i]);}return resolved;}
}


TypeResolver.where(Map<TypeVariableKey, ? extends Type>)方法不是公开的,所以上面的代码的createTypeResolver方法实现只能调用 TypeResolver.where(Type, Type),将Map中的键值一个一个添加到TypeResolver对象

EnhancedTypeResolver的构造方法要求是类型变量(TypeVariable)–实际类型的映射(Map)。
有了这个映射 ,就可以调用resolveType(Type)resolveTypes(Type[])将一个类型中的类型变量(TypeVariable)替换中实际类型。

示例代码:

Map<TypeVariable<?>, Type> typeVariables = getNormalizedTypeVariables(ServiceC.class, false);
EnhancedTypeResolver typeResolver = new EnhancedTypeResolver(typeVariables);
for( Method method:ServiceC.class.getMethods()) {/** 解析方法的泛型参数 */Type[] resolved = typeResolver.resolveTypes(method.getGenericParameterTypes());
}

输出结果:

USER_T@ServiceA ServiceA.fox(List<USER_T>,PAPER_T@ServiceA)
└─BaseUserBean ServiceA.fox(List,BasePaperBean)
└─BaseUserBean ServiceA.fox(List,PaperBean)

完整代码
以上完整实现代码参见码云仓库:
https://gitee.com/l0km/common-java/blob/master/common-base2/src/main/java/net/gdface/reflection/generics/EnhancedTypeResolver.java

完整测试代码参见码云仓库:
https://gitee.com/l0km/common-java/blob/master/common-base2/src/test/java/net/gdface/utils/TypeVariableTest.java

http://www.lryc.cn/news/378411.html

相关文章:

  • ru俄罗斯域名如何申请SSL证书?
  • python实现购物车的功能
  • 日元预计明年开始上涨
  • 8、PHP 实现二进制中1的个数、数值的整数次方
  • linux git凭证管理
  • WIC 图像处理初体验——读取像素的值
  • 使用Server-Sent Events (SSE),并获取message里面的内容
  • LabVIEW项目管理中如何平衡成本、时间和质量
  • 如何检查 Kubernetes 网络配置
  • 如何将网站封装成App:小猪APP分发助你实现
  • 探索C嘎嘎的奇妙世界:第十六关---STL(vector的练习)
  • 最新扣子(Coze)实战案例:扣子卡片的制作及使用,完全免费教程
  • Node-red win11安装
  • 永久更改R包的安装目录
  • Webrtc支持FFMPEG硬解码之NVIDA(二)
  • 整理好了!2024年最常见 20 道设计模式面试题(九)
  • RAG实操教程langchain+Milvus向量数据库创建你的本地知识库 二
  • Spring+SpringMVC介绍+bean实例化+依赖注入实战
  • 【安装笔记-20240616-Linux-为 OpenWrt 自动挂载 Windows 主机共享目录】
  • 61.WEB渗透测试-信息收集- WAF、框架组件识别(1)
  • qmt量化交易策略小白学习笔记第45期【qmt编程之期货行情数据--如何获取日线行情、tick行情】
  • c#default 运算符
  • 25计算机考研,这所985有机会!
  • SQL 基础入门教程
  • <Python><paddleocr>基于python使用百度paddleocr实现图片文字识别与替换
  • 小程序开发的费用简介篇
  • torch.unflod与torch.nn.functional.pad用法
  • 江苏 服务器性能监控包含哪些方面?
  • 卓越的 App UI 风格引领潮流
  • BirdTalk IM集群中消息流转策略讨论