From 3996f3339916dafffbedcf155d9f540f73db1966 Mon Sep 17 00:00:00 2001 From: Sebastien Deleuze Date: Sun, 24 Sep 2017 22:44:07 +0200 Subject: [PATCH] Support non-standard classes in Kotlin reflection discovery methods Issue: SPR-15999 --- .../org/springframework/beans/BeanUtils.java | 17 +++++++++++------ .../AutowiredAnnotationBeanPostProcessor.java | 15 ++++++++++----- ...otlinReflectionParameterNameDiscoverer.java | 18 ++++++++++++++---- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/BeanUtils.java b/spring-beans/src/main/java/org/springframework/beans/BeanUtils.java index cfd19018f7b..374600c2e21 100644 --- a/spring-beans/src/main/java/org/springframework/beans/BeanUtils.java +++ b/spring-beans/src/main/java/org/springframework/beans/BeanUtils.java @@ -735,14 +735,19 @@ public abstract class BeanUtils { */ @Nullable public static Constructor findPrimaryConstructor(Class clazz) { - KFunction primaryConstructor = KClasses.getPrimaryConstructor(JvmClassMappingKt.getKotlinClass(clazz)); - if (primaryConstructor == null) { + try { + KFunction primaryConstructor = KClasses.getPrimaryConstructor(JvmClassMappingKt.getKotlinClass(clazz)); + if (primaryConstructor == null) { + return null; + } + Constructor constructor = ReflectJvmMapping.getJavaConstructor(primaryConstructor); + Assert.notNull(constructor, + () -> "Failed to find Java constructor corresponding to Kotlin primary constructor: " + clazz.getName()); + return constructor; + } + catch (UnsupportedOperationException ex) { return null; } - Constructor constructor = ReflectJvmMapping.getJavaConstructor(primaryConstructor); - Assert.notNull(constructor, - () -> "Failed to find Java constructor corresponding to Kotlin primary constructor: " + clazz.getName()); - return constructor; } /** diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java index 9bd70bbc8d2..97b73f11191 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java @@ -781,13 +781,18 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean */ @Nullable public static Constructor findPrimaryConstructor(Class clazz) { - KFunction primaryConstructor = KClasses.getPrimaryConstructor(JvmClassMappingKt.getKotlinClass(clazz)); - if (primaryConstructor == null) { + try { + KFunction primaryConstructor = KClasses.getPrimaryConstructor(JvmClassMappingKt.getKotlinClass(clazz)); + if (primaryConstructor == null) { + return null; + } + Constructor constructor = ReflectJvmMapping.getJavaConstructor(primaryConstructor); + Assert.notNull(constructor, "Can't get the Java constructor corresponding to the Kotlin primary constructor of " + clazz.getName()); + return constructor; + } + catch (UnsupportedOperationException ex) { return null; } - Constructor constructor = ReflectJvmMapping.getJavaConstructor(primaryConstructor); - Assert.notNull(constructor, "Can't get the Java constructor corresponding to the Kotlin primary constructor of " + clazz.getName()); - return constructor; } } diff --git a/spring-core/src/main/java/org/springframework/core/KotlinReflectionParameterNameDiscoverer.java b/spring-core/src/main/java/org/springframework/core/KotlinReflectionParameterNameDiscoverer.java index 19f4468ac2a..b3178630453 100644 --- a/spring-core/src/main/java/org/springframework/core/KotlinReflectionParameterNameDiscoverer.java +++ b/spring-core/src/main/java/org/springframework/core/KotlinReflectionParameterNameDiscoverer.java @@ -62,8 +62,13 @@ public class KotlinReflectionParameterNameDiscoverer implements ParameterNameDis if (!useKotlinSupport(method.getDeclaringClass())) { return null; } - KFunction function = ReflectJvmMapping.getKotlinFunction(method); - return (function != null ? getParameterNames(function.getParameters()) : null); + try { + KFunction function = ReflectJvmMapping.getKotlinFunction(method); + return (function != null ? getParameterNames(function.getParameters()) : null); + } + catch (UnsupportedOperationException ex) { + return null; + } } @Override @@ -72,8 +77,13 @@ public class KotlinReflectionParameterNameDiscoverer implements ParameterNameDis if (!useKotlinSupport(ctor.getDeclaringClass())) { return null; } - KFunction function = ReflectJvmMapping.getKotlinFunction(ctor); - return (function != null ? getParameterNames(function.getParameters()) : null); + try { + KFunction function = ReflectJvmMapping.getKotlinFunction(ctor); + return (function != null ? getParameterNames(function.getParameters()) : null); + } + catch (UnsupportedOperationException ex) { + return null; + } } @Nullable