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); }