Add fast-path in BeanUtils#instantiateClass
For no-args constructor. See gh-24104
This commit is contained in:
parent
42ab1b75e7
commit
edcc559b4a
|
|
@ -51,6 +51,7 @@ import org.springframework.util.Assert;
|
||||||
import org.springframework.util.ClassUtils;
|
import org.springframework.util.ClassUtils;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
import org.springframework.util.ConcurrentReferenceHashMap;
|
import org.springframework.util.ConcurrentReferenceHashMap;
|
||||||
|
import org.springframework.util.ObjectUtils;
|
||||||
import org.springframework.util.ReflectionUtils;
|
import org.springframework.util.ReflectionUtils;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
|
@ -188,11 +189,18 @@ public abstract class BeanUtils {
|
||||||
try {
|
try {
|
||||||
ReflectionUtils.makeAccessible(ctor);
|
ReflectionUtils.makeAccessible(ctor);
|
||||||
if (KotlinDetector.isKotlinReflectPresent() && KotlinDetector.isKotlinType(ctor.getDeclaringClass())) {
|
if (KotlinDetector.isKotlinReflectPresent() && KotlinDetector.isKotlinType(ctor.getDeclaringClass())) {
|
||||||
|
if (ObjectUtils.isEmpty(args)) {
|
||||||
|
return KotlinDelegate.instantiateClass(ctor);
|
||||||
|
}
|
||||||
return KotlinDelegate.instantiateClass(ctor, args);
|
return KotlinDelegate.instantiateClass(ctor, args);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
int parameterCount = ctor.getParameterCount();
|
||||||
|
Assert.isTrue(args.length <= parameterCount, "Can't specify more arguments than constructor parameters");
|
||||||
|
if (parameterCount == 0) {
|
||||||
|
return ctor.newInstance();
|
||||||
|
}
|
||||||
Class<?>[] parameterTypes = ctor.getParameterTypes();
|
Class<?>[] parameterTypes = ctor.getParameterTypes();
|
||||||
Assert.isTrue(args.length <= parameterTypes.length, "Can't specify more arguments than constructor parameters");
|
|
||||||
Object[] argsWithDefaultValues = new Object[args.length];
|
Object[] argsWithDefaultValues = new Object[args.length];
|
||||||
for (int i = 0 ; i < args.length; i++) {
|
for (int i = 0 ; i < args.length; i++) {
|
||||||
if (args[i] == null) {
|
if (args[i] == null) {
|
||||||
|
|
@ -887,6 +895,24 @@ public abstract class BeanUtils {
|
||||||
return kotlinConstructor.callBy(argParameters);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue