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);
}
相關文章
相關標籤/搜索