From 58aeab3ab68766676942bd097dc42b5f1d2c553c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Mon, 27 Jun 2022 12:20:29 +0200 Subject: [PATCH] Refactor BindingReflectionHintsRegistrar This commit splits registerReflectionHints in multiple methods. See gh-28683 --- .../BindingReflectionHintsRegistrar.java | 58 +++++++++---------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/aot/hint/support/BindingReflectionHintsRegistrar.java b/spring-core/src/main/java/org/springframework/aot/hint/support/BindingReflectionHintsRegistrar.java index 57eb6d976a..2c8d89b566 100644 --- a/spring-core/src/main/java/org/springframework/aot/hint/support/BindingReflectionHintsRegistrar.java +++ b/spring-core/src/main/java/org/springframework/aot/hint/support/BindingReflectionHintsRegistrar.java @@ -97,34 +97,8 @@ public class BindingReflectionHintsRegistrar { BeanInfo beanInfo = Introspector.getBeanInfo(clazz); PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor propertyDescriptor : propertyDescriptors) { - Method writeMethod = propertyDescriptor.getWriteMethod(); - if (writeMethod != null && writeMethod.getDeclaringClass() != Object.class - && writeMethod.getDeclaringClass() != Enum.class) { - hints.registerMethod(writeMethod, INVOKE); - MethodParameter methodParameter = MethodParameter.forExecutable(writeMethod, 0); - Type methodParameterType = methodParameter.getGenericParameterType(); - if (!seen.contains(methodParameterType)) { - registerReflectionHints(hints, seen, methodParameterType); - } - } - Method readMethod = propertyDescriptor.getReadMethod(); - if (readMethod != null && readMethod.getDeclaringClass() != Object.class - && readMethod.getDeclaringClass() != Enum.class) { - hints.registerMethod(readMethod, INVOKE); - MethodParameter methodParameter = MethodParameter.forExecutable(readMethod, -1); - Type methodParameterType = methodParameter.getGenericParameterType(); - if (!seen.contains(methodParameterType)) { - registerReflectionHints(hints, seen, methodParameterType); - } - } - } - String companionClassName = clazz.getCanonicalName() + KOTLIN_COMPANION_SUFFIX; - if (KotlinDetector.isKotlinType(clazz) && ClassUtils.isPresent(companionClassName, null)) { - Class companionClass = ClassUtils.resolveClassName(companionClassName, null); - Method serializerMethod = ClassUtils.getMethodIfAvailable(companionClass, "serializer"); - if (serializerMethod != null) { - hints.registerMethod(serializerMethod); - } + registerPropertyHints(hints, seen, propertyDescriptor.getWriteMethod(), 0); + registerPropertyHints(hints, seen, propertyDescriptor.getReadMethod(), -1); } } catch (IntrospectionException ex) { @@ -133,6 +107,7 @@ public class BindingReflectionHintsRegistrar { } } } + registerKotlinSerializationHints(hints, clazz); }); } Set> referencedTypes = new LinkedHashSet<>(); @@ -140,8 +115,31 @@ public class BindingReflectionHintsRegistrar { referencedTypes.forEach(referencedType -> registerReflectionHints(hints, seen, referencedType)); } - private void collectReferencedTypes(Set seen, Set> types, @Nullable Type type) { - if (type == null || seen.contains(type)) { + private void registerPropertyHints(ReflectionHints hints, Set seen, @Nullable Method method, int parameterIndex) { + if (method != null && method.getDeclaringClass() != Object.class + && method.getDeclaringClass() != Enum.class) { + hints.registerMethod(method, INVOKE); + MethodParameter methodParameter = MethodParameter.forExecutable(method, parameterIndex); + Type methodParameterType = methodParameter.getGenericParameterType(); + if (!seen.contains(methodParameterType)) { + registerReflectionHints(hints, seen, methodParameterType); + } + } + } + + private void registerKotlinSerializationHints(ReflectionHints hints, Class clazz) { + String companionClassName = clazz.getCanonicalName() + KOTLIN_COMPANION_SUFFIX; + if (KotlinDetector.isKotlinType(clazz) && ClassUtils.isPresent(companionClassName, null)) { + Class companionClass = ClassUtils.resolveClassName(companionClassName, null); + Method serializerMethod = ClassUtils.getMethodIfAvailable(companionClass, "serializer"); + if (serializerMethod != null) { + hints.registerMethod(serializerMethod); + } + } + } + + private void collectReferencedTypes(Set seen, Set> types, Type type) { + if (seen.contains(type)) { return; } ResolvableType resolvableType = ResolvableType.forType(type);