做视频网站需要流媒体吗,微信公众号制作平台,户外广告公司,快链友情链接平台上一篇博客《java:类型变量(TypeVariable)解析–获取泛型类(Generic Class)所有的类型变量(TypeVariable)的实际映射类型》中介绍如何如何正确解析泛型类的类型变量(TypeVariable)#xff0c;获取对应的实际类型。 有了类型变量(TypeVariable)–实际类型的映射#xff0c;我们…上一篇博客《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(MapTypeVariable?, Type typeVariables) {typeVariables MoreObjects.firstNonNull(typeVariables, Collections.TypeVariable?, TypeemptyMap());typeResolver createTypeResolver(typeVariables);}public EnhancedTypeResolver() {this(Collections.TypeVariable?, TypeemptyMap());}/*** 根据提供的类型变量-实际类型映射创建{link TypeResolver}* param typeVariables*/public static TypeResolver createTypeResolver(MapTypeVariable?, Type typeVariables) {TypeResolver _typeResolver new TypeResolver();for(EntryTypeVariable?, Type entry:MoreObjects.firstNonNull(typeVariables, Collections.TypeVariable?, TypeemptyMap()).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 i0;iresolved.length;i) {resolved[i] resolveType(resolved[i]);}return resolved;}
} 注 TypeResolver.where(MapTypeVariableKey, ? extends Type)方法不是公开的所以上面的代码的createTypeResolver方法实现只能调用 TypeResolver.where(Type, Type),将Map中的键值一个一个添加到TypeResolver对象 EnhancedTypeResolver的构造方法要求是类型变量(TypeVariable)–实际类型的映射(Map)。 有了这个映射 就可以调用resolveType(Type)或resolveTypes(Type[])将一个类型中的类型变量(TypeVariable)替换中实际类型。
示例代码
MapTypeVariable?, Type typeVariables getNormalizedTypeVariables(ServiceC.class, false);
EnhancedTypeResolver typeResolver new EnhancedTypeResolver(typeVariables);
for( Method method:ServiceC.class.getMethods()) {/** 解析方法的泛型参数 */Type[] resolved typeResolver.resolveTypes(method.getGenericParameterTypes());
}输出结果 USER_TServiceA ServiceA.fox(ListUSER_T,PAPER_TServiceA) └─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