背景:看mybatis源码,看到Reflect类的关于Type的运用,就学习记录一下。
Type一般的出现,都是为了读取泛型类型
一般各种反射类通过getGenericType获得Type类型
Type有ParameterizedType类型。
List<T>比如这个类型,获得到的Type就是ParameterizedType。
常用方法:
ParameterizedType.getActualTypeArguments():能够获得到泛型的类型,比如这里获得到List<T>里的T,因为泛型可以是数组,比如Map<T, V>,所以ParameterizedType.getActualTypeArguments()返回的是数组Type。
ParameterizedType.getOwnerType():能获得到所属父类的Type,比如Map.Entity<K, V)调用ParameterizedType.getOwnerType()获得的就是Map的Type
ParameterizedType.getRawType():获得的是本身的Type,比如List<T>获得的就是List。
比如fastJson的转换泛型:
JSON.parseObject(reponse,new TypeReference<HisRetVO<SignNumberRetVO>>() {})
因为,如果直接传入HisRetVO.Class是读取不到泛型里的类型的,所以传入匿名类TypeReference。
看TypeReference里的源码,就是通过ParameterizedType.getActualTypeArguments()获取到泛型,然后保存,之后才能知道到底把Json转换成哪种类型。
protected TypeReference(){
// 获取父类的泛型Type,这里获得的是TypeReference的Type
Type superClass = getClass().getGenericSuperclass();
// 这里通过getActualTypeArguments方法获得TypeReference<T>里面的泛型,这里获得的是HisRetVO<SignNumberRetVO>的type
Type type = ((ParameterizedType) superClass).getActualTypeArguments()[0];
Type cachedType = classTypeCache.get(type);
if (cachedType == null) {
classTypeCache.putIfAbsent(type, type);
cachedType = classTypeCache.get(type);
}
this.type = cachedType;
}
Type还有一个类型是GenericArrayType
比如:T[] List<String>[]这种带泛型的数组。
常用方法:
GenericArrayType.getGenericComponentType:能够获得到泛型数组的泛型类型,比如T[]能获得到T的类型,List<String>[]能获得到List<String]类型。
其他的跟ParameterizedType差不多
Type还有一种类型是TypeVariable
比如:T 这种单独泛型的变量。
t.getBounds(),比如获得到泛型的上限,比如K extends Number 获得到的就是Number
Type还有一个类型是WildcardType
这种是泛型的表达式,比如List<? extends Number>、List<? super Number>这种
WildcardType.getLowerBounds 获得下边界,比如List<? super Number>就能获得Number。
WildcardType.getUpperBounds 获得上边界,比如List<? extends Number>就能获得上边界Number
Type还有一个类型就是Class类型
这个没什么好说的
其他相关方法:
Class.getTypeParameters()能获得类上面的定义的泛型,比如class List<T>,List.class.getTypeParameters()能获得T类型。
Method.getGenericParameterTypes()能获得方法的所有参数类型的Type。
网友评论