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

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值