From 7a8d41e5d6d4ac85d6d74d80c311800d78e0a721 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 30 Mar 2018 13:41:22 +0200 Subject: [PATCH] Extended set of common classes and language interfaces in ClassUtils Issue: SPR-16667 --- .../org/springframework/util/ClassUtils.java | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/util/ClassUtils.java b/spring-core/src/main/java/org/springframework/util/ClassUtils.java index 33bf4bbf3cd..52853dd19ad 100644 --- a/spring-core/src/main/java/org/springframework/util/ClassUtils.java +++ b/spring-core/src/main/java/org/springframework/util/ClassUtils.java @@ -17,6 +17,7 @@ package org.springframework.util; import java.beans.Introspector; +import java.io.Closeable; import java.io.Externalizable; import java.io.Serializable; import java.lang.reflect.Array; @@ -27,12 +28,15 @@ import java.lang.reflect.Proxy; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.IdentityHashMap; import java.util.Iterator; import java.util.LinkedHashSet; +import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import org.springframework.lang.Nullable; @@ -76,13 +80,6 @@ public abstract class ClassUtils { public static final String CLASS_FILE_SUFFIX = ".class"; - /** - * Common Java language interfaces which are supposed to be ignored - * when searching for 'primary' user-level interfaces. - */ - private static final Set> javaLanguageInterfaces = new HashSet<>( - Arrays.asList(Serializable.class, Externalizable.class, Cloneable.class, Comparable.class)); - /** * Map with primitive wrapper type as key and corresponding primitive * type as value, for example: Integer.class -> int.class. @@ -102,10 +99,16 @@ public abstract class ClassUtils { private static final Map> primitiveTypeNameMap = new HashMap<>(32); /** - * Map with common "java.lang" class name as key and corresponding Class as value. + * Map with common Java language class name as key and corresponding Class as value. * Primarily for efficient deserialization of remote invocations. */ - private static final Map> commonClassCache = new HashMap<>(32); + private static final Map> commonClassCache = new HashMap<>(64); + + /** + * Common Java language interfaces which are supposed to be ignored + * when searching for 'primary' user-level interfaces. + */ + private static final Set> javaLanguageInterfaces; static { @@ -135,9 +138,16 @@ public abstract class ClassUtils { registerCommonClasses(Boolean[].class, Byte[].class, Character[].class, Double[].class, Float[].class, Integer[].class, Long[].class, Short[].class); registerCommonClasses(Number.class, Number[].class, String.class, String[].class, - Object.class, Object[].class, Class.class, Class[].class); + Class.class, Class[].class, Object.class, Object[].class); registerCommonClasses(Throwable.class, Exception.class, RuntimeException.class, Error.class, StackTraceElement.class, StackTraceElement[].class); + registerCommonClasses(Enum.class, Iterable.class, Iterator.class, Enumeration.class, + Collection.class, List.class, Set.class, Map.class, Map.Entry.class, Optional.class); + + Class[] javaLanguageInterfaceArray = {Serializable.class, Externalizable.class, + Closeable.class, AutoCloseable.class, Cloneable.class, Comparable.class}; + registerCommonClasses(javaLanguageInterfaceArray); + javaLanguageInterfaces = new HashSet<>(Arrays.asList(javaLanguageInterfaceArray)); } @@ -1235,10 +1245,10 @@ public abstract class ClassUtils { /** * Determine whether the given interface is a common Java language interface: - * {@link Serializable}, {@link Externalizable}, {@link Cloneable}, {@link Comparable} - * - all of which can be ignored when looking for 'primary' user-level interfaces. - * Common characteristics: no service-level operations, no bean property methods, - * no default methods. + * {@link Serializable}, {@link Externalizable}, {@link Closeable}, {@link AutoCloseable}, + * {@link Cloneable}, {@link Comparable} - all of which can be ignored when looking + * for 'primary' user-level interfaces. Common characteristics: no service-level + * operations, no bean property methods, no default methods. * @param ifc the interface to check * @since 5.0.3 */