Skip to content

Commit d654139

Browse files
committed
Refactoring.
1 parent 543d464 commit d654139

File tree

1 file changed

+42
-50
lines changed

1 file changed

+42
-50
lines changed

src/main/java/org/apache/ibatis/reflection/TypeParameterResolver.java

Lines changed: 42 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -32,51 +32,43 @@ public class TypeParameterResolver {
3232
* @return The return type of the method as {@link Type}. If it has type parameters in the declaration,<br>
3333
* they will be resolved to the actual runtime {@link Type}.
3434
*/
35-
public static Type resolveReturnType(Method method, Type mapper) {
35+
public static Type resolveReturnType(Method method, Type srcType) {
3636
Type returnType = method.getGenericReturnType();
3737
Class<?> declaringClass = method.getDeclaringClass();
38-
Type result = null;
39-
if (returnType instanceof TypeVariable) {
40-
result = resolveTypeVar((TypeVariable<?>) returnType, mapper, declaringClass);
41-
} else if (returnType instanceof ParameterizedType) {
42-
result = resolveParameterizedType((ParameterizedType) returnType, mapper, declaringClass);
43-
} else if (returnType instanceof GenericArrayType) {
44-
result = resolveGenericArrayType((GenericArrayType) returnType, mapper, declaringClass);
45-
} else {
46-
result = returnType;
47-
}
48-
return result;
38+
return resolveType(returnType, srcType, declaringClass);
4939
}
5040

51-
public static Type[] resolveParamTypes(Method method, Type mapper) {
41+
public static Type[] resolveParamTypes(Method method, Type srcType) {
5242
Type[] paramTypes = method.getGenericParameterTypes();
5343
Class<?> declaringClass = method.getDeclaringClass();
5444
Type[] result = new Type[paramTypes.length];
5545
for (int i = 0; i < paramTypes.length; i++) {
56-
if (paramTypes[i] instanceof Class) {
57-
result[i] = paramTypes[i];
58-
} else if (paramTypes[i] instanceof TypeVariable) {
59-
result[i] = resolveTypeVar((TypeVariable<?>) paramTypes[i], mapper, declaringClass);
60-
} else if (paramTypes[i] instanceof ParameterizedType) {
61-
result[i] = resolveParameterizedType((ParameterizedType) paramTypes[i], mapper, declaringClass);
62-
} else if (paramTypes[i] instanceof GenericArrayType) {
63-
result[i] = resolveGenericArrayType((GenericArrayType) paramTypes[i], mapper, declaringClass);
64-
} else {
65-
// should we support other types?
66-
}
46+
result[i] = resolveType(paramTypes[i], srcType, declaringClass);
6747
}
6848
return result;
6949
}
7050

71-
private static Type resolveGenericArrayType(GenericArrayType genericArrayType, Type mapper, Class<?> declaringClass) {
51+
private static Type resolveType(Type type, Type srcType, Class<?> declaringClass) {
52+
if (type instanceof TypeVariable) {
53+
return resolveTypeVar((TypeVariable<?>) type, srcType, declaringClass);
54+
} else if (type instanceof ParameterizedType) {
55+
return resolveParameterizedType((ParameterizedType) type, srcType, declaringClass);
56+
} else if (type instanceof GenericArrayType) {
57+
return resolveGenericArrayType((GenericArrayType) type, srcType, declaringClass);
58+
} else {
59+
return type;
60+
}
61+
}
62+
63+
private static Type resolveGenericArrayType(GenericArrayType genericArrayType, Type srcType, Class<?> declaringClass) {
7264
Type componentType = genericArrayType.getGenericComponentType();
7365
Type resolvedComponentType = null;
7466
if (componentType instanceof TypeVariable) {
75-
resolvedComponentType = resolveTypeVar((TypeVariable<?>) componentType, mapper, declaringClass);
67+
resolvedComponentType = resolveTypeVar((TypeVariable<?>) componentType, srcType, declaringClass);
7668
} else if (componentType instanceof GenericArrayType) {
77-
resolvedComponentType = resolveGenericArrayType((GenericArrayType) componentType, mapper, declaringClass);
69+
resolvedComponentType = resolveGenericArrayType((GenericArrayType) componentType, srcType, declaringClass);
7870
} else if (componentType instanceof ParameterizedType) {
79-
resolvedComponentType = resolveParameterizedType((ParameterizedType) componentType, mapper, declaringClass);
71+
resolvedComponentType = resolveParameterizedType((ParameterizedType) componentType, srcType, declaringClass);
8072
}
8173
if (resolvedComponentType instanceof Class) {
8274
return Array.newInstance((Class<?>) resolvedComponentType, 0).getClass();
@@ -85,79 +77,79 @@ private static Type resolveGenericArrayType(GenericArrayType genericArrayType, T
8577
}
8678
}
8779

88-
private static ParameterizedType resolveParameterizedType(ParameterizedType parameterizedType, Type mapper, Class<?> declaringClass) {
80+
private static ParameterizedType resolveParameterizedType(ParameterizedType parameterizedType, Type srcType, Class<?> declaringClass) {
8981
Class<?> rawType = (Class<?>) parameterizedType.getRawType();
9082
Type[] typeArgs = parameterizedType.getActualTypeArguments();
9183
Type[] args = new Type[typeArgs.length];
9284
for (int i = 0; i < typeArgs.length; i++) {
9385
if (typeArgs[i] instanceof TypeVariable) {
94-
args[i] = resolveTypeVar((TypeVariable<?>) typeArgs[i], mapper, declaringClass);
86+
args[i] = resolveTypeVar((TypeVariable<?>) typeArgs[i], srcType, declaringClass);
9587
} else if (typeArgs[i] instanceof ParameterizedType) {
96-
args[i] = resolveParameterizedType((ParameterizedType) typeArgs[i], mapper, declaringClass);
88+
args[i] = resolveParameterizedType((ParameterizedType) typeArgs[i], srcType, declaringClass);
9789
} else if (typeArgs[i] instanceof WildcardType) {
98-
args[i] = resolveWildcardType((WildcardType) typeArgs[i], mapper, declaringClass);
90+
args[i] = resolveWildcardType((WildcardType) typeArgs[i], srcType, declaringClass);
9991
} else {
10092
args[i] = typeArgs[i];
10193
}
10294
}
10395
return new ParameterizedTypeImpl(rawType, null, args);
10496
}
10597

106-
private static Type resolveWildcardType(WildcardType wildcardType, Type mapper, Class<?> declaringClass) {
107-
Type[] lowerBounds = resolveWildcardTypeBounds(wildcardType.getLowerBounds(), mapper, declaringClass);
108-
Type[] upperBounds = resolveWildcardTypeBounds(wildcardType.getUpperBounds(), mapper, declaringClass);
98+
private static Type resolveWildcardType(WildcardType wildcardType, Type srcType, Class<?> declaringClass) {
99+
Type[] lowerBounds = resolveWildcardTypeBounds(wildcardType.getLowerBounds(), srcType, declaringClass);
100+
Type[] upperBounds = resolveWildcardTypeBounds(wildcardType.getUpperBounds(), srcType, declaringClass);
109101
return new WildcardTypeImpl(lowerBounds, upperBounds);
110102
}
111103

112-
private static Type[] resolveWildcardTypeBounds(Type[] bounds, Type mapper, Class<?> declaringClass) {
104+
private static Type[] resolveWildcardTypeBounds(Type[] bounds, Type srcType, Class<?> declaringClass) {
113105
Type[] result = new Type[bounds.length];
114106
for (int i = 0; i < bounds.length; i++) {
115107
if (bounds[i] instanceof TypeVariable) {
116-
result[i] = resolveTypeVar((TypeVariable<?>) bounds[i], mapper, declaringClass);
108+
result[i] = resolveTypeVar((TypeVariable<?>) bounds[i], srcType, declaringClass);
117109
} else if (bounds[i] instanceof ParameterizedType) {
118-
result[i] = resolveParameterizedType((ParameterizedType) bounds[i], mapper, declaringClass);
110+
result[i] = resolveParameterizedType((ParameterizedType) bounds[i], srcType, declaringClass);
119111
} else if (bounds[i] instanceof WildcardType) {
120-
result[i] = resolveWildcardType((WildcardType) bounds[i], mapper, declaringClass);
112+
result[i] = resolveWildcardType((WildcardType) bounds[i], srcType, declaringClass);
121113
} else {
122114
result[i] = bounds[i];
123115
}
124116
}
125117
return result;
126118
}
127119

128-
private static Type resolveTypeVar(TypeVariable<?> typeVar, Type type, Class<?> declaringClass) {
120+
private static Type resolveTypeVar(TypeVariable<?> typeVar, Type srcType, Class<?> declaringClass) {
129121
Type result = null;
130122
Class<?> clazz = null;
131-
if (type instanceof Class) {
132-
clazz = (Class<?>) type;
133-
} else if (type instanceof ParameterizedType) {
134-
ParameterizedType parameterizedType = (ParameterizedType) type;
123+
if (srcType instanceof Class) {
124+
clazz = (Class<?>) srcType;
125+
} else if (srcType instanceof ParameterizedType) {
126+
ParameterizedType parameterizedType = (ParameterizedType) srcType;
135127
clazz = (Class<?>) parameterizedType.getRawType();
136128
} else {
137-
throw new IllegalArgumentException("The 2nd arg must be Class or ParameterizedType, but was: " + type.getClass());
129+
throw new IllegalArgumentException("The 2nd arg must be Class or ParameterizedType, but was: " + srcType.getClass());
138130
}
139131

140132
if (clazz == declaringClass) {
141133
return Object.class;
142134
}
143135

144136
Type superclass = clazz.getGenericSuperclass();
145-
result = scanSuperTypes(typeVar, type, declaringClass, clazz, superclass);
137+
result = scanSuperTypes(typeVar, srcType, declaringClass, clazz, superclass);
146138
if (result != null) {
147139
return result;
148140
}
149141

150142
Type[] superInterfaces = clazz.getGenericInterfaces();
151143
for (Type superInterface : superInterfaces) {
152-
result = scanSuperTypes(typeVar, type, declaringClass, clazz, superInterface);
144+
result = scanSuperTypes(typeVar, srcType, declaringClass, clazz, superInterface);
153145
if (result != null) {
154146
return result;
155147
}
156148
}
157149
return Object.class;
158150
}
159151

160-
private static Type scanSuperTypes(TypeVariable<?> typeVar, Type type, Class<?> declaringClass, Class<?> clazz, Type superclass) {
152+
private static Type scanSuperTypes(TypeVariable<?> typeVar, Type srcType, Class<?> declaringClass, Class<?> clazz, Type superclass) {
161153
Type result = null;
162154
if (superclass instanceof ParameterizedType) {
163155
ParameterizedType parentAsType = (ParameterizedType) superclass;
@@ -171,8 +163,8 @@ private static Type scanSuperTypes(TypeVariable<?> typeVar, Type type, Class<?>
171163
TypeVariable<?>[] typeParams = clazz.getTypeParameters();
172164
for (int j = 0; j < typeParams.length; j++) {
173165
if (typeParams[j] == typeArgs[i]) {
174-
if (type instanceof ParameterizedType) {
175-
result = ((ParameterizedType) type).getActualTypeArguments()[j];
166+
if (srcType instanceof ParameterizedType) {
167+
result = ((ParameterizedType) srcType).getActualTypeArguments()[j];
176168
}
177169
break;
178170
}

0 commit comments

Comments
 (0)