Mybatis TypeParameterResolver

TypeParameterResolver这是个工具类,提供了一系类静态方法来解析指定类中字段,方法返回值或作者方法参数类型。

public static Type resolveFieldType(Field field, Type srcType) {//解析字段的类型
  Type fieldType = field.getGenericType();//获取字段的声明类型
  Class<?> declaringClass = field.getDeclaringClass();//获取字段定义所在的类的Class对象
  return resolveType(fieldType, srcType, declaringClass);//后续处理
}
private static Type resolveType(Type type, Type srcType, Class<?> declaringClass) {
  if (type instanceof TypeVariable) {//解析type为TypeVariable类型的
    return resolveTypeVar((TypeVariable<?>) type, srcType, declaringClass);
  } else if (type instanceof ParameterizedType) {//解析type为ParameterizedType类型的
    return resolveParameterizedType((ParameterizedType) type, srcType, declaringClass);
  } else if (type instanceof GenericArrayType) {//解析type为GenericArrayType类型的
    return resolveGenericArrayType((GenericArrayType) type, srcType, declaringClass);
  } else {
    return type;//class类型
  }//由于wildcardType是通配符泛型,所以不会直接把字段,返回值,参数定义为此类型,但可嵌套在别的类型中
}
private static ParameterizedType resolveParameterizedType(ParameterizedType parameterizedType, Type srcType, Class<?> declaringClass) {//
第一个参数是待解析的parameterizedType类型参数,第二个是解析操作的起始类型,第三个是定义该字段或方法的类的class对象
  Class<?> rawType = (Class<?>) parameterizedType.getRawType();//得到原始类型对应得class对象,如List<String>原始类型为List
  Type[] typeArgs = parameterizedType.getActualTypeArguments();//获取参数化类型的类型变量或实际类型列表 如:Map<Integer,String>实际泛型列表是Integer和String 可能有多层嵌套情况
  Type[] args = new Type[typeArgs.length];//保存解析后的结果
  for (int i = 0; i < typeArgs.length; i++) {//解析上面的参数化类型的类型变量或实际类型列表
    if (typeArgs[i] instanceof TypeVariable) {//解析类型变量
      args[i] = resolveTypeVar((TypeVariable<?>) typeArgs[i], srcType, declaringClass);
    } else if (typeArgs[i] instanceof ParameterizedType) {//如果嵌套了ParameterizedType则递归调用resolveParameterizedType处理
      args[i] = resolveParameterizedType((ParameterizedType) typeArgs[i], srcType, declaringClass);
    } else if (typeArgs[i] instanceof WildcardType) {//如果嵌套了WildcardType则调用resolveWildcardType处理
      args[i] = resolveWildcardType((WildcardType) typeArgs[i], srcType, declaringClass);
    } else {
      args[i] = typeArgs[i];
    }
  }//将解析的结果封装成ParameterizedTypeImpl实现并返回
  return new ParameterizedTypeImpl(rawType, null, args);
}

 

转载于:https://my.oschina.net/u/3795791/blog/2247878

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值