From 048e4f0aa2972c91fc59ef23f00a1256978ea64f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Thu, 28 Mar 2024 11:12:50 +0100 Subject: [PATCH] Invoke KCallablesJvm.setAccessible only when required Closes-32536 --- .../java/org/springframework/core/CoroutinesUtils.java | 8 +++++--- .../web/method/support/InvocableHandlerMethod.java | 8 +++++--- .../reactive/result/method/InvocableHandlerMethod.java | 8 +++++--- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/core/CoroutinesUtils.java b/spring-core/src/main/java/org/springframework/core/CoroutinesUtils.java index 2a5c12b7e19..d4c14078a54 100644 --- a/spring-core/src/main/java/org/springframework/core/CoroutinesUtils.java +++ b/spring-core/src/main/java/org/springframework/core/CoroutinesUtils.java @@ -130,9 +130,11 @@ public abstract class CoroutinesUtils { KType type = parameter.getType(); if (!(type.isMarkedNullable() && arg == null) && type.getClassifier() instanceof KClass kClass && KotlinDetector.isInlineClass(JvmClassMappingKt.getJavaClass(kClass))) { - KFunction valueClassConstructor = KClasses.getPrimaryConstructor(kClass); - KCallablesJvm.setAccessible(valueClassConstructor, true); - arg = valueClassConstructor.call(arg); + KFunction constructor = KClasses.getPrimaryConstructor(kClass); + if (!KCallablesJvm.isAccessible(constructor)) { + KCallablesJvm.setAccessible(constructor, true); + } + arg = constructor.call(arg); } argMap.put(parameter, arg); } diff --git a/spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java b/spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java index 214d18e0faa..a32fd354737 100644 --- a/spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java +++ b/spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java @@ -319,9 +319,11 @@ public class InvocableHandlerMethod extends HandlerMethod { KType type = parameter.getType(); if (!(type.isMarkedNullable() && arg == null) && type.getClassifier() instanceof KClass kClass && KotlinDetector.isInlineClass(JvmClassMappingKt.getJavaClass(kClass))) { - KFunction valueClassConstructor = KClasses.getPrimaryConstructor(kClass); - KCallablesJvm.setAccessible(valueClassConstructor, true); - arg = valueClassConstructor.call(arg); + KFunction constructor = KClasses.getPrimaryConstructor(kClass); + if (!KCallablesJvm.isAccessible(constructor)) { + KCallablesJvm.setAccessible(constructor, true); + } + arg = constructor.call(arg); } argMap.put(parameter, arg); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/InvocableHandlerMethod.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/InvocableHandlerMethod.java index 4130bfd164d..8bc8dd8dfa6 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/InvocableHandlerMethod.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/InvocableHandlerMethod.java @@ -330,9 +330,11 @@ public class InvocableHandlerMethod extends HandlerMethod { KType type = parameter.getType(); if (!(type.isMarkedNullable() && arg == null) && type.getClassifier() instanceof KClass kClass && KotlinDetector.isInlineClass(JvmClassMappingKt.getJavaClass(kClass))) { - KFunction valueClassConstructor = KClasses.getPrimaryConstructor(kClass); - KCallablesJvm.setAccessible(valueClassConstructor, true); - arg = valueClassConstructor.call(arg); + KFunction constructor = KClasses.getPrimaryConstructor(kClass); + if (!KCallablesJvm.isAccessible(constructor)) { + KCallablesJvm.setAccessible(constructor, true); + } + arg = constructor.call(arg); } argMap.put(parameter, arg); }