17
17
package org .springframework .core .convert .support ;
18
18
19
19
import java .lang .reflect .Constructor ;
20
+ import java .lang .reflect .Executable ;
20
21
import java .lang .reflect .InvocationTargetException ;
21
- import java .lang .reflect .Member ;
22
22
import java .lang .reflect .Method ;
23
23
import java .lang .reflect .Modifier ;
24
24
import java .util .Collections ;
71
71
*/
72
72
final class ObjectToObjectConverter implements ConditionalGenericConverter {
73
73
74
- // Cache for the latest to-method resolved on a given Class
75
- private static final Map <Class <?>, Member > conversionMemberCache =
74
+ // Cache for the latest to-method, static factory method, or factory constructor
75
+ // resolved on a given Class
76
+ private static final Map <Class <?>, Executable > conversionExecutableCache =
76
77
new ConcurrentReferenceHashMap <>(32 );
77
78
78
79
@@ -95,11 +96,11 @@ public Object convert(@Nullable Object source, TypeDescriptor sourceType, TypeDe
95
96
}
96
97
Class <?> sourceClass = sourceType .getType ();
97
98
Class <?> targetClass = targetType .getType ();
98
- Member member = getValidatedMember (targetClass , sourceClass );
99
+ Executable executable = getValidatedExecutable (targetClass , sourceClass );
99
100
100
101
try {
101
- if (member instanceof Method ) {
102
- Method method = (Method ) member ;
102
+ if (executable instanceof Method ) {
103
+ Method method = (Method ) executable ;
103
104
ReflectionUtils .makeAccessible (method );
104
105
if (!Modifier .isStatic (method .getModifiers ())) {
105
106
return method .invoke (source );
@@ -108,8 +109,8 @@ public Object convert(@Nullable Object source, TypeDescriptor sourceType, TypeDe
108
109
return method .invoke (null , source );
109
110
}
110
111
}
111
- else if (member instanceof Constructor ) {
112
- Constructor <?> ctor = (Constructor <?>) member ;
112
+ else if (executable instanceof Constructor ) {
113
+ Constructor <?> ctor = (Constructor <?>) executable ;
113
114
ReflectionUtils .makeAccessible (ctor );
114
115
return ctor .newInstance (source );
115
116
}
@@ -130,42 +131,41 @@ else if (member instanceof Constructor) {
130
131
}
131
132
132
133
133
-
134
134
static boolean hasConversionMethodOrConstructor (Class <?> targetClass , Class <?> sourceClass ) {
135
- return (getValidatedMember (targetClass , sourceClass ) != null );
135
+ return (getValidatedExecutable (targetClass , sourceClass ) != null );
136
136
}
137
137
138
138
@ Nullable
139
- private static Member getValidatedMember (Class <?> targetClass , Class <?> sourceClass ) {
140
- Member member = conversionMemberCache .get (targetClass );
141
- if (isApplicable (member , sourceClass )) {
142
- return member ;
139
+ private static Executable getValidatedExecutable (Class <?> targetClass , Class <?> sourceClass ) {
140
+ Executable executable = conversionExecutableCache .get (targetClass );
141
+ if (isApplicable (executable , sourceClass )) {
142
+ return executable ;
143
143
}
144
144
145
- member = determineToMethod (targetClass , sourceClass );
146
- if (member == null ) {
147
- member = determineFactoryMethod (targetClass , sourceClass );
148
- if (member == null ) {
149
- member = determineFactoryConstructor (targetClass , sourceClass );
150
- if (member == null ) {
145
+ executable = determineToMethod (targetClass , sourceClass );
146
+ if (executable == null ) {
147
+ executable = determineFactoryMethod (targetClass , sourceClass );
148
+ if (executable == null ) {
149
+ executable = determineFactoryConstructor (targetClass , sourceClass );
150
+ if (executable == null ) {
151
151
return null ;
152
152
}
153
153
}
154
154
}
155
155
156
- conversionMemberCache .put (targetClass , member );
157
- return member ;
156
+ conversionExecutableCache .put (targetClass , executable );
157
+ return executable ;
158
158
}
159
159
160
- private static boolean isApplicable (Member member , Class <?> sourceClass ) {
161
- if (member instanceof Method ) {
162
- Method method = (Method ) member ;
160
+ private static boolean isApplicable (Executable executable , Class <?> sourceClass ) {
161
+ if (executable instanceof Method ) {
162
+ Method method = (Method ) executable ;
163
163
return (!Modifier .isStatic (method .getModifiers ()) ?
164
164
ClassUtils .isAssignable (method .getDeclaringClass (), sourceClass ) :
165
165
method .getParameterTypes ()[0 ] == sourceClass );
166
166
}
167
- else if (member instanceof Constructor ) {
168
- Constructor <?> ctor = (Constructor <?>) member ;
167
+ else if (executable instanceof Constructor ) {
168
+ Constructor <?> ctor = (Constructor <?>) executable ;
169
169
return (ctor .getParameterTypes ()[0 ] == sourceClass );
170
170
}
171
171
else {
0 commit comments