diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultRecordMapper.java b/jOOQ/src/main/java/org/jooq/impl/DefaultRecordMapper.java index 5ab3f5a8b7..ae4bb3cfa3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultRecordMapper.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultRecordMapper.java @@ -55,6 +55,7 @@ import static org.jooq.impl.Tools.hasColumnAnnotations; import static org.jooq.tools.reflect.Reflect.accessible; import java.beans.ConstructorProperties; +import java.lang.invoke.MethodHandles.Lookup; import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; @@ -423,12 +424,15 @@ public class DefaultRecordMapper implements RecordMapper { + Constructor constructor; + @Override public final E map(R record) { return new MutablePOJOMapper(null, proxy()).map(record); } private E proxy() { + final Object[] result = new Object[1]; final Map map = new HashMap(); final InvocationHandler handler = new InvocationHandler() { @@ -439,22 +443,38 @@ public class DefaultRecordMapper implements RecordMapper declaringClass = method.getDeclaringClass(); + return constructor + .newInstance(declaringClass, Lookup.PRIVATE) + .unreflectSpecial(method, declaringClass) + .bindTo(result[0]) + .invokeWithArguments(args); + } + catch (Throwable e) { + throw new MappingException("Cannot invoke default method", e); + } + return null; } }; - return (E) Proxy.newProxyInstance(type.getClassLoader(), new Class[] { type }, handler); + result[0] = Proxy.newProxyInstance(type.getClassLoader(), new Class[] { type }, handler); + return (E) result[0]; } }