From 8e73b573293cc46eeffff6fc33fccc677b5ebc31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Thu, 22 Sep 2022 17:48:30 +0200 Subject: [PATCH] Refine Kotlin changes This refinement ensures the constructor is properly accessible, avoid duplicating current logic and provide a slightly faster implementation of the Kotlin codepath. See gh-24104 --- .../org/springframework/beans/BeanUtils.java | 28 ++++--------------- 1 file changed, 5 insertions(+), 23 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 d11f387f27c..c306b6b899b 100644 --- a/spring-beans/src/main/java/org/springframework/beans/BeanUtils.java +++ b/spring-beans/src/main/java/org/springframework/beans/BeanUtils.java @@ -51,7 +51,6 @@ import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; import org.springframework.util.ConcurrentReferenceHashMap; -import org.springframework.util.ObjectUtils; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; @@ -189,9 +188,6 @@ public abstract class BeanUtils { try { ReflectionUtils.makeAccessible(ctor); if (KotlinDetector.isKotlinReflectPresent() && KotlinDetector.isKotlinType(ctor.getDeclaringClass())) { - if (ObjectUtils.isEmpty(args)) { - return KotlinDelegate.instantiateClass(ctor); - } return KotlinDelegate.instantiateClass(ctor, args); } else { @@ -884,9 +880,13 @@ public abstract class BeanUtils { } List parameters = kotlinConstructor.getParameters(); - Map argParameters = CollectionUtils.newHashMap(parameters.size()); + Assert.isTrue(args.length <= parameters.size(), "Number of provided arguments should be less of equals than number of constructor parameters"); + if (parameters.isEmpty()) { + return kotlinConstructor.call(); + } + Map argParameters = CollectionUtils.newHashMap(parameters.size()); for (int i = 0 ; i < args.length ; i++) { if (!(parameters.get(i).isOptional() && args[i] == null)) { argParameters.put(parameters.get(i), args[i]); @@ -895,24 +895,6 @@ public abstract class BeanUtils { return kotlinConstructor.callBy(argParameters); } - /** - * Instantiate a Kotlin class using provided no-arg constructor. - * @param ctor the constructor of the Kotlin class to instantiate - */ - public static T instantiateClass(Constructor ctor) - throws IllegalAccessException, InvocationTargetException, InstantiationException { - - KFunction kotlinConstructor = ReflectJvmMapping.getKotlinFunction(ctor); - if (kotlinConstructor == null) { - return ctor.newInstance(); - } - List parameters = kotlinConstructor.getParameters(); - Assert.isTrue(parameters.isEmpty(), "Default no-args constructor must have no params"); - Map argParameters = Collections.emptyMap(); - return kotlinConstructor.callBy(argParameters); - } - - } }