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