diff --git a/org.springframework.core/src/main/java/org/springframework/core/GenericTypeResolver.java b/org.springframework.core/src/main/java/org/springframework/core/GenericTypeResolver.java index ae9c3f825bf..8d238a03f00 100644 --- a/org.springframework.core/src/main/java/org/springframework/core/GenericTypeResolver.java +++ b/org.springframework.core/src/main/java/org/springframework/core/GenericTypeResolver.java @@ -16,6 +16,8 @@ package org.springframework.core; +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; import java.lang.reflect.GenericArrayType; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; @@ -43,8 +45,8 @@ import org.springframework.util.Assert; public abstract class GenericTypeResolver { /** Cache from Class to TypeVariable Map */ - private static final Map> typeVariableCache = - Collections.synchronizedMap(new WeakHashMap>()); + private static final Map>> typeVariableCache = + Collections.synchronizedMap(new WeakHashMap>>()); /** @@ -152,7 +154,8 @@ public abstract class GenericTypeResolver { * enclosing types and interfaces. */ static Map getTypeVariableMap(Class clazz) { - Map typeVariableMap = typeVariableCache.get(clazz); + Reference> ref = typeVariableCache.get(clazz); + Map typeVariableMap = (ref != null ? ref.get() : null); if (typeVariableMap == null) { typeVariableMap = new HashMap(); @@ -184,7 +187,7 @@ public abstract class GenericTypeResolver { type = type.getEnclosingClass(); } - typeVariableCache.put(clazz, typeVariableMap); + typeVariableCache.put(clazz, new WeakReference>(typeVariableMap)); } return typeVariableMap;