diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultRecordMapper.java b/jOOQ/src/main/java/org/jooq/impl/DefaultRecordMapper.java index fac803a103..508c1b72ee 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultRecordMapper.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultRecordMapper.java @@ -54,15 +54,8 @@ import static org.jooq.tools.reflect.Reflect.accessible; import java.beans.ConstructorProperties; import java.lang.invoke.MethodHandles.Lookup; +import java.lang.reflect.*; import java.lang.reflect.Array; -import java.lang.reflect.Constructor; -import java.lang.reflect.Executable; -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.lang.reflect.Parameter; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Proxy; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Arrays; @@ -92,6 +85,7 @@ import org.jooq.exception.MappingException; import org.jooq.tools.Convert; import org.jooq.tools.StringUtils; import org.jooq.tools.reflect.Reflect; +import org.jooq.tools.reflect.ReflectException; /** * This is the default implementation for RecordMapper types. @@ -375,6 +369,38 @@ public class DefaultRecordMapper implements RecordMapper klassType = Reflect.on("kotlin.reflect.KClass").type(); + Method getJavaClass = JvmClassMappingKt.type().getMethod("getJavaClass", klassType); + + List parameterNames = new ArrayList<>(); + Class[] parameterTypes = new Class[parameters.size()]; + for (int i = 0; i < parameters.size(); i++) { + Reflect parameter = Reflect.on(parameters.get(i)); + parameterNames.add(parameter.call("getName").get()); + Object typeClassifier = parameter.call("getType").call("getClassifier").get(); + parameterTypes[i] = (Class) getJavaClass.invoke(JvmClassMappingKt.get(), typeClassifier); + } + + Constructor javaConstructor = (Constructor) this.type.getConstructor(parameterTypes); + delegate = new ImmutablePOJOMapperWithParameterNames(javaConstructor, parameterNames); + return; + } + } catch (ReflectException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + // do nothing + } + + boolean mapConstructorParameterNames = TRUE.equals(configuration.settings().isMapConstructorParameterNames());