Skip to content

Commit 97854d9

Browse files
committed
Refactor ObjectToObjectConverter to use Executable instead of Member
1 parent 73f3860 commit 97854d9

File tree

1 file changed

+27
-27
lines changed

1 file changed

+27
-27
lines changed

spring-core/src/main/java/org/springframework/core/convert/support/ObjectToObjectConverter.java

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
package org.springframework.core.convert.support;
1818

1919
import java.lang.reflect.Constructor;
20+
import java.lang.reflect.Executable;
2021
import java.lang.reflect.InvocationTargetException;
21-
import java.lang.reflect.Member;
2222
import java.lang.reflect.Method;
2323
import java.lang.reflect.Modifier;
2424
import java.util.Collections;
@@ -71,8 +71,9 @@
7171
*/
7272
final class ObjectToObjectConverter implements ConditionalGenericConverter {
7373

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 =
7677
new ConcurrentReferenceHashMap<>(32);
7778

7879

@@ -95,11 +96,11 @@ public Object convert(@Nullable Object source, TypeDescriptor sourceType, TypeDe
9596
}
9697
Class<?> sourceClass = sourceType.getType();
9798
Class<?> targetClass = targetType.getType();
98-
Member member = getValidatedMember(targetClass, sourceClass);
99+
Executable executable = getValidatedExecutable(targetClass, sourceClass);
99100

100101
try {
101-
if (member instanceof Method) {
102-
Method method = (Method) member;
102+
if (executable instanceof Method) {
103+
Method method = (Method) executable;
103104
ReflectionUtils.makeAccessible(method);
104105
if (!Modifier.isStatic(method.getModifiers())) {
105106
return method.invoke(source);
@@ -108,8 +109,8 @@ public Object convert(@Nullable Object source, TypeDescriptor sourceType, TypeDe
108109
return method.invoke(null, source);
109110
}
110111
}
111-
else if (member instanceof Constructor) {
112-
Constructor<?> ctor = (Constructor<?>) member;
112+
else if (executable instanceof Constructor) {
113+
Constructor<?> ctor = (Constructor<?>) executable;
113114
ReflectionUtils.makeAccessible(ctor);
114115
return ctor.newInstance(source);
115116
}
@@ -130,42 +131,41 @@ else if (member instanceof Constructor) {
130131
}
131132

132133

133-
134134
static boolean hasConversionMethodOrConstructor(Class<?> targetClass, Class<?> sourceClass) {
135-
return (getValidatedMember(targetClass, sourceClass) != null);
135+
return (getValidatedExecutable(targetClass, sourceClass) != null);
136136
}
137137

138138
@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;
143143
}
144144

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) {
151151
return null;
152152
}
153153
}
154154
}
155155

156-
conversionMemberCache.put(targetClass, member);
157-
return member;
156+
conversionExecutableCache.put(targetClass, executable);
157+
return executable;
158158
}
159159

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;
163163
return (!Modifier.isStatic(method.getModifiers()) ?
164164
ClassUtils.isAssignable(method.getDeclaringClass(), sourceClass) :
165165
method.getParameterTypes()[0] == sourceClass);
166166
}
167-
else if (member instanceof Constructor) {
168-
Constructor<?> ctor = (Constructor<?>) member;
167+
else if (executable instanceof Constructor) {
168+
Constructor<?> ctor = (Constructor<?>) executable;
169169
return (ctor.getParameterTypes()[0] == sourceClass);
170170
}
171171
else {

0 commit comments

Comments
 (0)