1818
1919import  java .lang .reflect .Array ;
2020import  java .lang .reflect .GenericArrayType ;
21+ import  java .lang .reflect .MalformedParameterizedTypeException ;
2122import  java .lang .reflect .Method ;
2223import  java .lang .reflect .ParameterizedType ;
2324import  java .lang .reflect .Type ;
@@ -74,12 +75,12 @@ public static Type getTargetType(MethodParameter methodParam) {
7475	 * @param clazz the class to resolve type variables against 
7576	 * @return the corresponding generic parameter or return type 
7677	 */ 
77- 	public  static  Class <?> resolveParameterType (MethodParameter  methodParam , Class  clazz ) {
78+ 	public  static  Class <?> resolveParameterType (MethodParameter  methodParam , Class <?>  clazz ) {
7879		Type  genericType  = getTargetType (methodParam );
7980		Assert .notNull (clazz , "Class must not be null" );
8081		Map <TypeVariable , Type > typeVariableMap  = getTypeVariableMap (clazz );
8182		Type  rawType  = getRawType (genericType , typeVariableMap );
82- 		Class  result  = (rawType  instanceof  Class  ? (Class ) rawType  : methodParam .getParameterType ());
83+ 		Class <?>  result  = (rawType  instanceof  Class  ? (Class ) rawType  : methodParam .getParameterType ());
8384		methodParam .setParameterType (result );
8485		methodParam .typeVariableMap  = typeVariableMap ;
8586		return  result ;
@@ -227,7 +228,7 @@ public static Class<?> resolveReturnTypeArgument(Method method, Class<?> generic
227228	 * @param genericIfc the generic interface or superclass to resolve the type argument from 
228229	 * @return the resolved type of the argument, or {@code null} if not resolvable 
229230	 */ 
230- 	public  static  Class <?> resolveTypeArgument (Class  clazz , Class  genericIfc ) {
231+ 	public  static  Class <?> resolveTypeArgument (Class <?>  clazz , Class <?>  genericIfc ) {
231232		Class [] typeArgs  = resolveTypeArguments (clazz , genericIfc );
232233		if  (typeArgs  == null ) {
233234			return  null ;
@@ -248,11 +249,11 @@ public static Class<?> resolveTypeArgument(Class clazz, Class genericIfc) {
248249	 * @return the resolved type of each argument, with the array size matching the 
249250	 * number of actual type arguments, or {@code null} if not resolvable 
250251	 */ 
251- 	public  static  Class [] resolveTypeArguments (Class  clazz , Class  genericIfc ) {
252+ 	public  static  Class [] resolveTypeArguments (Class <?>  clazz , Class <?>  genericIfc ) {
252253		return  doResolveTypeArguments (clazz , clazz , genericIfc );
253254	}
254255
255- 	private  static  Class [] doResolveTypeArguments (Class  ownerClass , Class  classToIntrospect , Class  genericIfc ) {
256+ 	private  static  Class [] doResolveTypeArguments (Class <?>  ownerClass , Class <?>  classToIntrospect , Class <?>  genericIfc ) {
256257		while  (classToIntrospect  != null ) {
257258			if  (genericIfc .isInterface ()) {
258259				Type [] ifcs  = classToIntrospect .getGenericInterfaces ();
@@ -264,18 +265,23 @@ private static Class[] doResolveTypeArguments(Class ownerClass, Class classToInt
264265				}
265266			}
266267			else  {
267- 				Class [] result  = doResolveTypeArguments (
268- 						ownerClass , classToIntrospect .getGenericSuperclass (), genericIfc );
269- 				if  (result  != null ) {
270- 					return  result ;
268+ 				try  {
269+ 					Class [] result  = doResolveTypeArguments (ownerClass , classToIntrospect .getGenericSuperclass (), genericIfc );
270+ 					if  (result  != null ) {
271+ 						return  result ;
272+ 					}
273+ 				}
274+ 				catch  (MalformedParameterizedTypeException  ex ) {
275+ 					// from getGenericSuperclass() - return null to skip further superclass traversal 
276+ 					return  null ;
271277				}
272278			}
273279			classToIntrospect  = classToIntrospect .getSuperclass ();
274280		}
275281		return  null ;
276282	}
277283
278- 	private  static  Class [] doResolveTypeArguments (Class  ownerClass , Type  ifc , Class  genericIfc ) {
284+ 	private  static  Class [] doResolveTypeArguments (Class <?>  ownerClass , Type  ifc , Class <?>  genericIfc ) {
279285		if  (ifc  instanceof  ParameterizedType ) {
280286			ParameterizedType  paramIfc  = (ParameterizedType ) ifc ;
281287			Type  rawType  = paramIfc .getRawType ();
@@ -301,7 +307,7 @@ else if (ifc != null && genericIfc.isAssignableFrom((Class) ifc)) {
301307	/** 
302308	 * Extract a class instance from given Type. 
303309	 */ 
304- 	private  static  Class  extractClass (Class  ownerClass , Type  arg ) {
310+ 	private  static  Class <?>  extractClass (Class <?>  ownerClass , Type  arg ) {
305311		if  (arg  instanceof  ParameterizedType ) {
306312			return  extractClass (ownerClass , ((ParameterizedType ) arg ).getRawType ());
307313		}
@@ -368,7 +374,7 @@ static Type getRawType(Type genericType, Map<TypeVariable, Type> typeVariableMap
368374	 * {@link Class concrete classes} for the specified {@link Class}. Searches 
369375	 * all super types, enclosing types and interfaces. 
370376	 */ 
371- 	public  static  Map <TypeVariable , Type > getTypeVariableMap (Class  clazz ) {
377+ 	public  static  Map <TypeVariable , Type > getTypeVariableMap (Class <?>  clazz ) {
372378		Map <TypeVariable , Type > typeVariableMap  = typeVariableCache .get (clazz );
373379
374380		if  (typeVariableMap  == null ) {
@@ -377,28 +383,37 @@ public static Map<TypeVariable, Type> getTypeVariableMap(Class clazz) {
377383			// interfaces 
378384			extractTypeVariablesFromGenericInterfaces (clazz .getGenericInterfaces (), typeVariableMap );
379385
380- 			// super class 
381- 			Type  genericType  = clazz .getGenericSuperclass ();
382- 			Class  type  = clazz .getSuperclass ();
383- 			while  (type  != null  && !Object .class .equals (type )) {
384- 				if  (genericType  instanceof  ParameterizedType ) {
385- 					ParameterizedType  pt  = (ParameterizedType ) genericType ;
386- 					populateTypeMapFromParameterizedType (pt , typeVariableMap );
386+ 			try  {
387+ 				// super class 
388+ 				Class <?> type  = clazz ;
389+ 				while  (type .getSuperclass () != null  && !Object .class .equals (type .getSuperclass ())) {
390+ 					Type  genericType  = type .getGenericSuperclass ();
391+ 					if  (genericType  instanceof  ParameterizedType ) {
392+ 						ParameterizedType  pt  = (ParameterizedType ) genericType ;
393+ 						populateTypeMapFromParameterizedType (pt , typeVariableMap );
394+ 					}
395+ 					extractTypeVariablesFromGenericInterfaces (type .getSuperclass ().getGenericInterfaces (), typeVariableMap );
396+ 					type  = type .getSuperclass ();
387397				}
388- 				 extractTypeVariablesFromGenericInterfaces ( type . getGenericInterfaces (),  typeVariableMap ); 
389- 				 genericType  =  type . getGenericSuperclass (); 
390- 				type  =  type . getSuperclass (); 
398+ 			} 
399+ 			catch  ( MalformedParameterizedTypeException   ex ) { 
400+ 				// from getGenericSuperclass() - ignore and continue with member class check 
391401			}
392402
393- 			// enclosing class 
394- 			type  = clazz ;
395- 			while  (type .isMemberClass ()) {
396- 				genericType  = type .getGenericSuperclass ();
397- 				if  (genericType  instanceof  ParameterizedType ) {
398- 					ParameterizedType  pt  = (ParameterizedType ) genericType ;
399- 					populateTypeMapFromParameterizedType (pt , typeVariableMap );
403+ 			try  {
404+ 				// enclosing class 
405+ 				Class <?> type  = clazz ;
406+ 				while  (type .isMemberClass ()) {
407+ 					Type  genericType  = type .getGenericSuperclass ();
408+ 					if  (genericType  instanceof  ParameterizedType ) {
409+ 						ParameterizedType  pt  = (ParameterizedType ) genericType ;
410+ 						populateTypeMapFromParameterizedType (pt , typeVariableMap );
411+ 					}
412+ 					type  = type .getEnclosingClass ();
400413				}
401- 				type  = type .getEnclosingClass ();
414+ 			}
415+ 			catch  (MalformedParameterizedTypeException  ex ) {
416+ 				// from getGenericSuperclass() - ignore and preserve previously accumulated type variables 
402417			}
403418
404419			typeVariableCache .put (clazz , typeVariableMap );
0 commit comments