|
|
|
|
@ -45,7 +45,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -45,7 +45,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* @param collectionClass the collection class to introspect |
|
|
|
|
* @return the generic type, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
public static Class getCollectionType(Class<? extends Collection> collectionClass) { |
|
|
|
|
public static Class<?> getCollectionType(Class<? extends Collection> collectionClass) { |
|
|
|
|
return extractTypeFromClass(collectionClass, Collection.class, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -55,7 +55,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -55,7 +55,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* @param mapClass the map class to introspect |
|
|
|
|
* @return the generic type, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
public static Class getMapKeyType(Class<? extends Map> mapClass) { |
|
|
|
|
public static Class<?> getMapKeyType(Class<? extends Map> mapClass) { |
|
|
|
|
return extractTypeFromClass(mapClass, Map.class, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -65,7 +65,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -65,7 +65,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* @param mapClass the map class to introspect |
|
|
|
|
* @return the generic type, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
public static Class getMapValueType(Class<? extends Map> mapClass) { |
|
|
|
|
public static Class<?> getMapValueType(Class<? extends Map> mapClass) { |
|
|
|
|
return extractTypeFromClass(mapClass, Map.class, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -74,7 +74,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -74,7 +74,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* @param collectionField the collection field to introspect |
|
|
|
|
* @return the generic type, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
public static Class getCollectionFieldType(Field collectionField) { |
|
|
|
|
public static Class<?> getCollectionFieldType(Field collectionField) { |
|
|
|
|
return getGenericFieldType(collectionField, Collection.class, 0, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -86,7 +86,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -86,7 +86,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* nested List, whereas 2 would indicate the element of the nested List) |
|
|
|
|
* @return the generic type, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
public static Class getCollectionFieldType(Field collectionField, int nestingLevel) { |
|
|
|
|
public static Class<?> getCollectionFieldType(Field collectionField, int nestingLevel) { |
|
|
|
|
return getGenericFieldType(collectionField, Collection.class, 0, nestingLevel); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -95,7 +95,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -95,7 +95,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* @param mapField the map field to introspect |
|
|
|
|
* @return the generic type, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
public static Class getMapKeyFieldType(Field mapField) { |
|
|
|
|
public static Class<?> getMapKeyFieldType(Field mapField) { |
|
|
|
|
return getGenericFieldType(mapField, Map.class, 0, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -107,7 +107,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -107,7 +107,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* nested List, whereas 2 would indicate the element of the nested List) |
|
|
|
|
* @return the generic type, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
public static Class getMapKeyFieldType(Field mapField, int nestingLevel) { |
|
|
|
|
public static Class<?> getMapKeyFieldType(Field mapField, int nestingLevel) { |
|
|
|
|
return getGenericFieldType(mapField, Map.class, 0, nestingLevel); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -116,7 +116,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -116,7 +116,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* @param mapField the map field to introspect |
|
|
|
|
* @return the generic type, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
public static Class getMapValueFieldType(Field mapField) { |
|
|
|
|
public static Class<?> getMapValueFieldType(Field mapField) { |
|
|
|
|
return getGenericFieldType(mapField, Map.class, 1, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -128,7 +128,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -128,7 +128,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* nested List, whereas 2 would indicate the element of the nested List) |
|
|
|
|
* @return the generic type, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
public static Class getMapValueFieldType(Field mapField, int nestingLevel) { |
|
|
|
|
public static Class<?> getMapValueFieldType(Field mapField, int nestingLevel) { |
|
|
|
|
return getGenericFieldType(mapField, Map.class, 1, nestingLevel); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -137,7 +137,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -137,7 +137,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* @param methodParam the method parameter specification |
|
|
|
|
* @return the generic type, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
public static Class getCollectionParameterType(MethodParameter methodParam) { |
|
|
|
|
public static Class<?> getCollectionParameterType(MethodParameter methodParam) { |
|
|
|
|
return getGenericParameterType(methodParam, Collection.class, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -146,7 +146,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -146,7 +146,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* @param methodParam the method parameter specification |
|
|
|
|
* @return the generic type, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
public static Class getMapKeyParameterType(MethodParameter methodParam) { |
|
|
|
|
public static Class<?> getMapKeyParameterType(MethodParameter methodParam) { |
|
|
|
|
return getGenericParameterType(methodParam, Map.class, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -155,7 +155,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -155,7 +155,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* @param methodParam the method parameter specification |
|
|
|
|
* @return the generic type, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
public static Class getMapValueParameterType(MethodParameter methodParam) { |
|
|
|
|
public static Class<?> getMapValueParameterType(MethodParameter methodParam) { |
|
|
|
|
return getGenericParameterType(methodParam, Map.class, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -164,7 +164,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -164,7 +164,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* @param method the method to check the return type for |
|
|
|
|
* @return the generic type, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
public static Class getCollectionReturnType(Method method) { |
|
|
|
|
public static Class<?> getCollectionReturnType(Method method) { |
|
|
|
|
return getGenericReturnType(method, Collection.class, 0, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -178,7 +178,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -178,7 +178,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* nested List, whereas 2 would indicate the element of the nested List) |
|
|
|
|
* @return the generic type, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
public static Class getCollectionReturnType(Method method, int nestingLevel) { |
|
|
|
|
public static Class<?> getCollectionReturnType(Method method, int nestingLevel) { |
|
|
|
|
return getGenericReturnType(method, Collection.class, 0, nestingLevel); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -187,7 +187,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -187,7 +187,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* @param method the method to check the return type for |
|
|
|
|
* @return the generic type, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
public static Class getMapKeyReturnType(Method method) { |
|
|
|
|
public static Class<?> getMapKeyReturnType(Method method) { |
|
|
|
|
return getGenericReturnType(method, Map.class, 0, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -199,7 +199,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -199,7 +199,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* nested List, whereas 2 would indicate the element of the nested List) |
|
|
|
|
* @return the generic type, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
public static Class getMapKeyReturnType(Method method, int nestingLevel) { |
|
|
|
|
public static Class<?> getMapKeyReturnType(Method method, int nestingLevel) { |
|
|
|
|
return getGenericReturnType(method, Map.class, 0, nestingLevel); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -208,7 +208,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -208,7 +208,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* @param method the method to check the return type for |
|
|
|
|
* @return the generic type, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
public static Class getMapValueReturnType(Method method) { |
|
|
|
|
public static Class<?> getMapValueReturnType(Method method) { |
|
|
|
|
return getGenericReturnType(method, Map.class, 1, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -220,7 +220,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -220,7 +220,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* nested List, whereas 2 would indicate the element of the nested List) |
|
|
|
|
* @return the generic type, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
public static Class getMapValueReturnType(Method method, int nestingLevel) { |
|
|
|
|
public static Class<?> getMapValueReturnType(Method method, int nestingLevel) { |
|
|
|
|
return getGenericReturnType(method, Map.class, 1, nestingLevel); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -233,7 +233,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -233,7 +233,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* 0 for Map keys, 1 for Map values) |
|
|
|
|
* @return the generic type, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
private static Class getGenericParameterType(MethodParameter methodParam, Class source, int typeIndex) { |
|
|
|
|
private static Class<?> getGenericParameterType(MethodParameter methodParam, Class<?> source, int typeIndex) { |
|
|
|
|
return extractType(methodParam, GenericTypeResolver.getTargetType(methodParam), |
|
|
|
|
source, typeIndex, methodParam.getNestingLevel(), 1); |
|
|
|
|
} |
|
|
|
|
@ -247,7 +247,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -247,7 +247,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* @param nestingLevel the nesting level of the target type |
|
|
|
|
* @return the generic type, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
private static Class getGenericFieldType(Field field, Class source, int typeIndex, int nestingLevel) { |
|
|
|
|
private static Class<?> getGenericFieldType(Field field, Class<?> source, int typeIndex, int nestingLevel) { |
|
|
|
|
return extractType(null, field.getGenericType(), source, typeIndex, nestingLevel, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -260,7 +260,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -260,7 +260,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* @param nestingLevel the nesting level of the target type |
|
|
|
|
* @return the generic type, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
private static Class getGenericReturnType(Method method, Class source, int typeIndex, int nestingLevel) { |
|
|
|
|
private static Class<?> getGenericReturnType(Method method, Class<?> source, int typeIndex, int nestingLevel) { |
|
|
|
|
return extractType(null, method.getGenericReturnType(), source, typeIndex, nestingLevel, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -268,14 +268,14 @@ public abstract class GenericCollectionTypeResolver {
@@ -268,14 +268,14 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* Extract the generic type from the given Type object. |
|
|
|
|
* @param methodParam the method parameter specification |
|
|
|
|
* @param type the Type to check |
|
|
|
|
* @param source the source collection/map Class that we check |
|
|
|
|
* @param source the source collection/map Class<?> that we check |
|
|
|
|
* @param typeIndex the index of the actual type argument |
|
|
|
|
* @param nestingLevel the nesting level of the target type |
|
|
|
|
* @param currentLevel the current nested level |
|
|
|
|
* @return the generic type as Class, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
private static Class extractType( |
|
|
|
|
MethodParameter methodParam, Type type, Class source, int typeIndex, int nestingLevel, int currentLevel) { |
|
|
|
|
private static Class<?> extractType( |
|
|
|
|
MethodParameter methodParam, Type type, Class<?> source, int typeIndex, int nestingLevel, int currentLevel) { |
|
|
|
|
|
|
|
|
|
Type resolvedType = type; |
|
|
|
|
if (type instanceof TypeVariable && methodParam != null && methodParam.typeVariableMap != null) { |
|
|
|
|
@ -306,8 +306,8 @@ public abstract class GenericCollectionTypeResolver {
@@ -306,8 +306,8 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
* @param currentLevel the current nested level |
|
|
|
|
* @return the generic type as Class, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
private static Class extractTypeFromParameterizedType(MethodParameter methodParam, |
|
|
|
|
ParameterizedType ptype, Class source, int typeIndex, int nestingLevel, int currentLevel) { |
|
|
|
|
private static Class<?> extractTypeFromParameterizedType(MethodParameter methodParam, |
|
|
|
|
ParameterizedType ptype, Class<?> source, int typeIndex, int nestingLevel, int currentLevel) { |
|
|
|
|
|
|
|
|
|
if (!(ptype.getRawType() instanceof Class)) { |
|
|
|
|
return null; |
|
|
|
|
@ -371,28 +371,28 @@ public abstract class GenericCollectionTypeResolver {
@@ -371,28 +371,28 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Extract the generic type from the given Class object. |
|
|
|
|
* @param clazz the Class to check |
|
|
|
|
* Extract the generic type from the given Class<?> object. |
|
|
|
|
* @param clazz the Class<?> to check |
|
|
|
|
* @param source the expected raw source type (can be <code>null</code>) |
|
|
|
|
* @param typeIndex the index of the actual type argument |
|
|
|
|
* @return the generic type as Class, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
private static Class extractTypeFromClass(Class clazz, Class source, int typeIndex) { |
|
|
|
|
private static Class<?> extractTypeFromClass(Class clazz, Class<?> source, int typeIndex) { |
|
|
|
|
return extractTypeFromClass(null, clazz, source, typeIndex, 1, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Extract the generic type from the given Class object. |
|
|
|
|
* Extract the generic type from the given Class<?> object. |
|
|
|
|
* @param methodParam the method parameter specification |
|
|
|
|
* @param clazz the Class to check |
|
|
|
|
* @param clazz the Class<?> to check |
|
|
|
|
* @param source the expected raw source type (can be <code>null</code>) |
|
|
|
|
* @param typeIndex the index of the actual type argument |
|
|
|
|
* @param nestingLevel the nesting level of the target type |
|
|
|
|
* @param currentLevel the current nested level |
|
|
|
|
* @return the generic type as Class, or <code>null</code> if none |
|
|
|
|
*/ |
|
|
|
|
private static Class extractTypeFromClass( |
|
|
|
|
MethodParameter methodParam, Class clazz, Class source, int typeIndex, int nestingLevel, int currentLevel) { |
|
|
|
|
private static Class<?> extractTypeFromClass( |
|
|
|
|
MethodParameter methodParam, Class<?> clazz, Class<?> source, int typeIndex, int nestingLevel, int currentLevel) { |
|
|
|
|
|
|
|
|
|
if (clazz.getName().startsWith("java.util.")) { |
|
|
|
|
return null; |
|
|
|
|
@ -407,7 +407,7 @@ public abstract class GenericCollectionTypeResolver {
@@ -407,7 +407,7 @@ public abstract class GenericCollectionTypeResolver {
|
|
|
|
|
if (ifc instanceof ParameterizedType) { |
|
|
|
|
rawType = ((ParameterizedType) ifc).getRawType(); |
|
|
|
|
} |
|
|
|
|
if (rawType instanceof Class && isIntrospectionCandidate((Class) rawType)) { |
|
|
|
|
if (rawType instanceof Class<?> && isIntrospectionCandidate((Class) rawType)) { |
|
|
|
|
return extractType(methodParam, ifc, source, typeIndex, nestingLevel, currentLevel); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|