17
17
package org .springframework .util ;
18
18
19
19
import java .beans .Introspector ;
20
+ import java .io .Closeable ;
20
21
import java .io .Externalizable ;
21
22
import java .io .Serializable ;
22
23
import java .lang .reflect .Array ;
27
28
import java .util .Arrays ;
28
29
import java .util .Collection ;
29
30
import java .util .Collections ;
31
+ import java .util .Enumeration ;
30
32
import java .util .HashMap ;
31
33
import java .util .HashSet ;
32
34
import java .util .IdentityHashMap ;
33
35
import java .util .Iterator ;
34
36
import java .util .LinkedHashSet ;
37
+ import java .util .List ;
35
38
import java .util .Map ;
39
+ import java .util .Optional ;
36
40
import java .util .Set ;
37
41
38
42
import org .springframework .lang .Nullable ;
@@ -76,13 +80,6 @@ public abstract class ClassUtils {
76
80
public static final String CLASS_FILE_SUFFIX = ".class" ;
77
81
78
82
79
- /**
80
- * Common Java language interfaces which are supposed to be ignored
81
- * when searching for 'primary' user-level interfaces.
82
- */
83
- private static final Set <Class <?>> javaLanguageInterfaces = new HashSet <>(
84
- Arrays .asList (Serializable .class , Externalizable .class , Cloneable .class , Comparable .class ));
85
-
86
83
/**
87
84
* Map with primitive wrapper type as key and corresponding primitive
88
85
* type as value, for example: Integer.class -> int.class.
@@ -102,10 +99,16 @@ public abstract class ClassUtils {
102
99
private static final Map <String , Class <?>> primitiveTypeNameMap = new HashMap <>(32 );
103
100
104
101
/**
105
- * Map with common "java.lang" class name as key and corresponding Class as value.
102
+ * Map with common Java language class name as key and corresponding Class as value.
106
103
* Primarily for efficient deserialization of remote invocations.
107
104
*/
108
- private static final Map <String , Class <?>> commonClassCache = new HashMap <>(32 );
105
+ private static final Map <String , Class <?>> commonClassCache = new HashMap <>(64 );
106
+
107
+ /**
108
+ * Common Java language interfaces which are supposed to be ignored
109
+ * when searching for 'primary' user-level interfaces.
110
+ */
111
+ private static final Set <Class <?>> javaLanguageInterfaces ;
109
112
110
113
111
114
static {
@@ -135,9 +138,16 @@ public abstract class ClassUtils {
135
138
registerCommonClasses (Boolean [].class , Byte [].class , Character [].class , Double [].class ,
136
139
Float [].class , Integer [].class , Long [].class , Short [].class );
137
140
registerCommonClasses (Number .class , Number [].class , String .class , String [].class ,
138
- Object .class , Object [].class , Class .class , Class [].class );
141
+ Class .class , Class [].class , Object .class , Object [].class );
139
142
registerCommonClasses (Throwable .class , Exception .class , RuntimeException .class ,
140
143
Error .class , StackTraceElement .class , StackTraceElement [].class );
144
+ registerCommonClasses (Enum .class , Iterable .class , Iterator .class , Enumeration .class ,
145
+ Collection .class , List .class , Set .class , Map .class , Map .Entry .class , Optional .class );
146
+
147
+ Class <?>[] javaLanguageInterfaceArray = {Serializable .class , Externalizable .class ,
148
+ Closeable .class , AutoCloseable .class , Cloneable .class , Comparable .class };
149
+ registerCommonClasses (javaLanguageInterfaceArray );
150
+ javaLanguageInterfaces = new HashSet <>(Arrays .asList (javaLanguageInterfaceArray ));
141
151
}
142
152
143
153
@@ -1235,10 +1245,10 @@ public static boolean isVisible(Class<?> clazz, @Nullable ClassLoader classLoade
1235
1245
1236
1246
/**
1237
1247
* Determine whether the given interface is a common Java language interface:
1238
- * {@link Serializable}, {@link Externalizable}, {@link Cloneable }, {@link Comparable}
1239
- * - all of which can be ignored when looking for 'primary' user-level interfaces.
1240
- * Common characteristics: no service-level operations, no bean property methods,
1241
- * no default methods.
1248
+ * {@link Serializable}, {@link Externalizable}, {@link Closeable }, {@link AutoCloseable},
1249
+ * {@link Cloneable}, {@link Comparable} - all of which can be ignored when looking
1250
+ * for 'primary' user-level interfaces. Common characteristics: no service-level
1251
+ * operations, no bean property methods, no default methods.
1242
1252
* @param ifc the interface to check
1243
1253
* @since 5.0.3
1244
1254
*/
0 commit comments