Skip to content

Commit

Permalink
Refine Kotlin changes
Browse files Browse the repository at this point in the history
This refinement ensures the constructor is properly
accessible, avoid duplicating current logic and
provide a slightly faster implementation of the
Kotlin codepath.

See spring-projectsgh-24104
  • Loading branch information
sdeleuze committed Sep 26, 2022
1 parent edcc559 commit 8e73b57
Showing 1 changed file with 5 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@
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;

Expand Down Expand Up @@ -189,9 +188,6 @@ public static <T> T instantiateClass(Constructor<T> ctor, Object... args) throws
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 {
Expand Down Expand Up @@ -884,9 +880,13 @@ public static <T> T instantiateClass(Constructor<T> ctor, Object... args)
}

List<KParameter> parameters = kotlinConstructor.getParameters();
Map<KParameter, Object> 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<KParameter, Object> 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]);
Expand All @@ -895,24 +895,6 @@ public static <T> T instantiateClass(Constructor<T> ctor, Object... args)
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> T instantiateClass(Constructor<T> ctor)
throws IllegalAccessException, InvocationTargetException, InstantiationException {

KFunction<T> kotlinConstructor = ReflectJvmMapping.getKotlinFunction(ctor);
if (kotlinConstructor == null) {
return ctor.newInstance();
}
List<KParameter> parameters = kotlinConstructor.getParameters();
Assert.isTrue(parameters.isEmpty(), "Default no-args constructor must have no params");
Map<KParameter, Object> argParameters = Collections.emptyMap();
return kotlinConstructor.callBy(argParameters);
}


}

}

0 comments on commit 8e73b57

Please sign in to comment.