Browse Source

ResolvableType.clearCache() clears SerializableTypeWrapper cache as well

Issue: SPR-15503
pull/1413/merge
Juergen Hoeller 9 years ago
parent
commit
7ca0094fa1
  1. 5
      spring-core/src/main/java/org/springframework/core/ResolvableType.java
  2. 41
      spring-core/src/main/java/org/springframework/core/SerializableTypeWrapper.java

5
spring-core/src/main/java/org/springframework/core/ResolvableType.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2017 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -1356,11 +1356,12 @@ public class ResolvableType implements Serializable {
} }
/** /**
* Clear the internal {@code ResolvableType} cache. * Clear the internal {@code ResolvableType}/{@code SerializableTypeWrapper} cache.
* @since 4.2 * @since 4.2
*/ */
public static void clearCache() { public static void clearCache() {
cache.clear(); cache.clear();
SerializableTypeWrapper.cache.clear();
} }

41
spring-core/src/main/java/org/springframework/core/SerializableTypeWrapper.java

@ -59,8 +59,7 @@ abstract class SerializableTypeWrapper {
private static final Class<?>[] SUPPORTED_SERIALIZABLE_TYPES = { private static final Class<?>[] SUPPORTED_SERIALIZABLE_TYPES = {
GenericArrayType.class, ParameterizedType.class, TypeVariable.class, WildcardType.class}; GenericArrayType.class, ParameterizedType.class, TypeVariable.class, WildcardType.class};
private static final ConcurrentReferenceHashMap<Type, Type> cache = static final ConcurrentReferenceHashMap<Type, Type> cache = new ConcurrentReferenceHashMap<>(256);
new ConcurrentReferenceHashMap<>(256);
/** /**
@ -84,12 +83,7 @@ abstract class SerializableTypeWrapper {
*/ */
@SuppressWarnings("serial") @SuppressWarnings("serial")
public static Type forGenericSuperclass(final Class<?> type) { public static Type forGenericSuperclass(final Class<?> type) {
return forTypeProvider(new DefaultTypeProvider() { return forTypeProvider(type::getGenericSuperclass);
@Override
public Type getType() {
return type.getGenericSuperclass();
}
});
} }
/** /**
@ -100,12 +94,7 @@ abstract class SerializableTypeWrapper {
Type[] result = new Type[type.getGenericInterfaces().length]; Type[] result = new Type[type.getGenericInterfaces().length];
for (int i = 0; i < result.length; i++) { for (int i = 0; i < result.length; i++) {
final int index = i; final int index = i;
result[i] = forTypeProvider(new DefaultTypeProvider() { result[i] = forTypeProvider(() -> type.getGenericInterfaces()[index]);
@Override
public Type getType() {
return type.getGenericInterfaces()[index];
}
});
} }
return result; return result;
} }
@ -118,12 +107,7 @@ abstract class SerializableTypeWrapper {
Type[] result = new Type[type.getTypeParameters().length]; Type[] result = new Type[type.getTypeParameters().length];
for (int i = 0; i < result.length; i++) { for (int i = 0; i < result.length; i++) {
final int index = i; final int index = i;
result[i] = forTypeProvider(new DefaultTypeProvider() { result[i] = forTypeProvider(() -> type.getTypeParameters()[index]);
@Override
public Type getType() {
return type.getTypeParameters()[index];
}
});
} }
return result; return result;
} }
@ -183,6 +167,7 @@ abstract class SerializableTypeWrapper {
/** /**
* A {@link Serializable} interface providing access to a {@link Type}. * A {@link Serializable} interface providing access to a {@link Type}.
*/ */
@SuppressWarnings("serial")
interface TypeProvider extends Serializable { interface TypeProvider extends Serializable {
/** /**
@ -191,20 +176,10 @@ abstract class SerializableTypeWrapper {
Type getType(); Type getType();
/** /**
* Return the source of the type or {@code null}. * Return the source of the type, or {@code null} if not known.
* <p>The default implementations returns {@code null}.
*/ */
Object getSource(); default Object getSource() {
}
/**
* Default implementation of {@link TypeProvider} with a {@code null} source.
*/
@SuppressWarnings("serial")
private static abstract class DefaultTypeProvider implements TypeProvider {
@Override
public Object getSource() {
return null; return null;
} }
} }

Loading…
Cancel
Save