From d654139aa09888804b5ed2509bbbd05d88fc7f05 Mon Sep 17 00:00:00 2001 From: Iwao AVE! <harawata@gmail.com> Date: Wed, 13 Apr 2016 12:10:12 +0900 Subject: [PATCH] Refactoring. --- .../reflection/TypeParameterResolver.java | 92 +++++++++---------- 1 file changed, 42 insertions(+), 50 deletions(-) diff --git a/src/main/java/org/apache/ibatis/reflection/TypeParameterResolver.java b/src/main/java/org/apache/ibatis/reflection/TypeParameterResolver.java index 6a94d02080b..1d5eaa8a410 100644 --- a/src/main/java/org/apache/ibatis/reflection/TypeParameterResolver.java +++ b/src/main/java/org/apache/ibatis/reflection/TypeParameterResolver.java @@ -32,51 +32,43 @@ public class TypeParameterResolver { * @return The return type of the method as {@link Type}. If it has type parameters in the declaration,<br> * they will be resolved to the actual runtime {@link Type}. */ - public static Type resolveReturnType(Method method, Type mapper) { + public static Type resolveReturnType(Method method, Type srcType) { Type returnType = method.getGenericReturnType(); Class<?> declaringClass = method.getDeclaringClass(); - Type result = null; - if (returnType instanceof TypeVariable) { - result = resolveTypeVar((TypeVariable<?>) returnType, mapper, declaringClass); - } else if (returnType instanceof ParameterizedType) { - result = resolveParameterizedType((ParameterizedType) returnType, mapper, declaringClass); - } else if (returnType instanceof GenericArrayType) { - result = resolveGenericArrayType((GenericArrayType) returnType, mapper, declaringClass); - } else { - result = returnType; - } - return result; + return resolveType(returnType, srcType, declaringClass); } - public static Type[] resolveParamTypes(Method method, Type mapper) { + public static Type[] resolveParamTypes(Method method, Type srcType) { Type[] paramTypes = method.getGenericParameterTypes(); Class<?> declaringClass = method.getDeclaringClass(); Type[] result = new Type[paramTypes.length]; for (int i = 0; i < paramTypes.length; i++) { - if (paramTypes[i] instanceof Class) { - result[i] = paramTypes[i]; - } else if (paramTypes[i] instanceof TypeVariable) { - result[i] = resolveTypeVar((TypeVariable<?>) paramTypes[i], mapper, declaringClass); - } else if (paramTypes[i] instanceof ParameterizedType) { - result[i] = resolveParameterizedType((ParameterizedType) paramTypes[i], mapper, declaringClass); - } else if (paramTypes[i] instanceof GenericArrayType) { - result[i] = resolveGenericArrayType((GenericArrayType) paramTypes[i], mapper, declaringClass); - } else { - // should we support other types? - } + result[i] = resolveType(paramTypes[i], srcType, declaringClass); } return result; } - private static Type resolveGenericArrayType(GenericArrayType genericArrayType, Type mapper, Class<?> declaringClass) { + private static Type resolveType(Type type, Type srcType, Class<?> declaringClass) { + if (type instanceof TypeVariable) { + return resolveTypeVar((TypeVariable<?>) type, srcType, declaringClass); + } else if (type instanceof ParameterizedType) { + return resolveParameterizedType((ParameterizedType) type, srcType, declaringClass); + } else if (type instanceof GenericArrayType) { + return resolveGenericArrayType((GenericArrayType) type, srcType, declaringClass); + } else { + return type; + } + } + + private static Type resolveGenericArrayType(GenericArrayType genericArrayType, Type srcType, Class<?> declaringClass) { Type componentType = genericArrayType.getGenericComponentType(); Type resolvedComponentType = null; if (componentType instanceof TypeVariable) { - resolvedComponentType = resolveTypeVar((TypeVariable<?>) componentType, mapper, declaringClass); + resolvedComponentType = resolveTypeVar((TypeVariable<?>) componentType, srcType, declaringClass); } else if (componentType instanceof GenericArrayType) { - resolvedComponentType = resolveGenericArrayType((GenericArrayType) componentType, mapper, declaringClass); + resolvedComponentType = resolveGenericArrayType((GenericArrayType) componentType, srcType, declaringClass); } else if (componentType instanceof ParameterizedType) { - resolvedComponentType = resolveParameterizedType((ParameterizedType) componentType, mapper, declaringClass); + resolvedComponentType = resolveParameterizedType((ParameterizedType) componentType, srcType, declaringClass); } if (resolvedComponentType instanceof Class) { return Array.newInstance((Class<?>) resolvedComponentType, 0).getClass(); @@ -85,17 +77,17 @@ public class TypeParameterResolver { } } - private static ParameterizedType resolveParameterizedType(ParameterizedType parameterizedType, Type mapper, Class<?> declaringClass) { + private static ParameterizedType resolveParameterizedType(ParameterizedType parameterizedType, Type srcType, Class<?> declaringClass) { Class<?> rawType = (Class<?>) parameterizedType.getRawType(); Type[] typeArgs = parameterizedType.getActualTypeArguments(); 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], mapper, declaringClass); + args[i] = resolveTypeVar((TypeVariable<?>) typeArgs[i], srcType, declaringClass); } else if (typeArgs[i] instanceof ParameterizedType) { - args[i] = resolveParameterizedType((ParameterizedType) typeArgs[i], mapper, declaringClass); + args[i] = resolveParameterizedType((ParameterizedType) typeArgs[i], srcType, declaringClass); } else if (typeArgs[i] instanceof WildcardType) { - args[i] = resolveWildcardType((WildcardType) typeArgs[i], mapper, declaringClass); + args[i] = resolveWildcardType((WildcardType) typeArgs[i], srcType, declaringClass); } else { args[i] = typeArgs[i]; } @@ -103,21 +95,21 @@ public class TypeParameterResolver { return new ParameterizedTypeImpl(rawType, null, args); } - private static Type resolveWildcardType(WildcardType wildcardType, Type mapper, Class<?> declaringClass) { - Type[] lowerBounds = resolveWildcardTypeBounds(wildcardType.getLowerBounds(), mapper, declaringClass); - Type[] upperBounds = resolveWildcardTypeBounds(wildcardType.getUpperBounds(), mapper, declaringClass); + private static Type resolveWildcardType(WildcardType wildcardType, Type srcType, Class<?> declaringClass) { + Type[] lowerBounds = resolveWildcardTypeBounds(wildcardType.getLowerBounds(), srcType, declaringClass); + Type[] upperBounds = resolveWildcardTypeBounds(wildcardType.getUpperBounds(), srcType, declaringClass); return new WildcardTypeImpl(lowerBounds, upperBounds); } - private static Type[] resolveWildcardTypeBounds(Type[] bounds, Type mapper, Class<?> declaringClass) { + private static Type[] resolveWildcardTypeBounds(Type[] bounds, Type srcType, Class<?> declaringClass) { Type[] result = new Type[bounds.length]; for (int i = 0; i < bounds.length; i++) { if (bounds[i] instanceof TypeVariable) { - result[i] = resolveTypeVar((TypeVariable<?>) bounds[i], mapper, declaringClass); + result[i] = resolveTypeVar((TypeVariable<?>) bounds[i], srcType, declaringClass); } else if (bounds[i] instanceof ParameterizedType) { - result[i] = resolveParameterizedType((ParameterizedType) bounds[i], mapper, declaringClass); + result[i] = resolveParameterizedType((ParameterizedType) bounds[i], srcType, declaringClass); } else if (bounds[i] instanceof WildcardType) { - result[i] = resolveWildcardType((WildcardType) bounds[i], mapper, declaringClass); + result[i] = resolveWildcardType((WildcardType) bounds[i], srcType, declaringClass); } else { result[i] = bounds[i]; } @@ -125,16 +117,16 @@ public class TypeParameterResolver { return result; } - private static Type resolveTypeVar(TypeVariable<?> typeVar, Type type, Class<?> declaringClass) { + private static Type resolveTypeVar(TypeVariable<?> typeVar, Type srcType, Class<?> declaringClass) { Type result = null; Class<?> clazz = null; - if (type instanceof Class) { - clazz = (Class<?>) type; - } else if (type instanceof ParameterizedType) { - ParameterizedType parameterizedType = (ParameterizedType) type; + if (srcType instanceof Class) { + clazz = (Class<?>) srcType; + } else if (srcType instanceof ParameterizedType) { + ParameterizedType parameterizedType = (ParameterizedType) srcType; clazz = (Class<?>) parameterizedType.getRawType(); } else { - throw new IllegalArgumentException("The 2nd arg must be Class or ParameterizedType, but was: " + type.getClass()); + throw new IllegalArgumentException("The 2nd arg must be Class or ParameterizedType, but was: " + srcType.getClass()); } if (clazz == declaringClass) { @@ -142,14 +134,14 @@ public class TypeParameterResolver { } Type superclass = clazz.getGenericSuperclass(); - result = scanSuperTypes(typeVar, type, declaringClass, clazz, superclass); + result = scanSuperTypes(typeVar, srcType, declaringClass, clazz, superclass); if (result != null) { return result; } Type[] superInterfaces = clazz.getGenericInterfaces(); for (Type superInterface : superInterfaces) { - result = scanSuperTypes(typeVar, type, declaringClass, clazz, superInterface); + result = scanSuperTypes(typeVar, srcType, declaringClass, clazz, superInterface); if (result != null) { return result; } @@ -157,7 +149,7 @@ public class TypeParameterResolver { return Object.class; } - private static Type scanSuperTypes(TypeVariable<?> typeVar, Type type, Class<?> declaringClass, Class<?> clazz, Type superclass) { + private static Type scanSuperTypes(TypeVariable<?> typeVar, Type srcType, Class<?> declaringClass, Class<?> clazz, Type superclass) { Type result = null; if (superclass instanceof ParameterizedType) { ParameterizedType parentAsType = (ParameterizedType) superclass; @@ -171,8 +163,8 @@ public class TypeParameterResolver { TypeVariable<?>[] typeParams = clazz.getTypeParameters(); for (int j = 0; j < typeParams.length; j++) { if (typeParams[j] == typeArgs[i]) { - if (type instanceof ParameterizedType) { - result = ((ParameterizedType) type).getActualTypeArguments()[j]; + if (srcType instanceof ParameterizedType) { + result = ((ParameterizedType) srcType).getActualTypeArguments()[j]; } break; } -- GitLab