From 928bb8949c7c7f82bda6a4753cffff999ca7d7c0 Mon Sep 17 00:00:00 2001 From: Steven Schlansker Date: Thu, 13 Jul 2023 14:31:01 -0700 Subject: [PATCH 1/2] OnDemandExtensions: flatten stack a bit by inlining Unchecked We call Unchecked three times, and this ends up adding a number of stack frames in the debugger or profiler any time you are looking at an ondemand sqlobject This fights back just a little bit against ever-deepening stack traces, and makes the logic easier to read too without the distracting Unchecked signatures in the middle --- .../UnableToCreateExtensionException.java | 4 ++++ .../v3/core/internal/OnDemandExtensions.java | 20 +++++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/org/jdbi/v3/core/extension/UnableToCreateExtensionException.java b/core/src/main/java/org/jdbi/v3/core/extension/UnableToCreateExtensionException.java index d29818da5c..ac698addbe 100644 --- a/core/src/main/java/org/jdbi/v3/core/extension/UnableToCreateExtensionException.java +++ b/core/src/main/java/org/jdbi/v3/core/extension/UnableToCreateExtensionException.java @@ -46,4 +46,8 @@ public UnableToCreateExtensionException(String format, Object... args) { public UnableToCreateExtensionException(Throwable throwable, String format, Object... args) { super(format(format, args), throwable); } + + public UnableToCreateExtensionException(Throwable cause) { + super(cause); + } } diff --git a/core/src/main/java/org/jdbi/v3/core/internal/OnDemandExtensions.java b/core/src/main/java/org/jdbi/v3/core/internal/OnDemandExtensions.java index 10cc7d2d5a..11cd5529a1 100644 --- a/core/src/main/java/org/jdbi/v3/core/internal/OnDemandExtensions.java +++ b/core/src/main/java/org/jdbi/v3/core/internal/OnDemandExtensions.java @@ -13,7 +13,6 @@ */ package org.jdbi.v3.core.internal; -import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; @@ -26,7 +25,7 @@ import org.jdbi.v3.core.Jdbi; import org.jdbi.v3.core.config.JdbiConfig; import org.jdbi.v3.core.extension.Extensions; -import org.jdbi.v3.core.internal.exceptions.Unchecked; +import org.jdbi.v3.core.internal.exceptions.Sneaky; import static org.jdbi.v3.core.internal.JdbiClassUtils.EQUALS_METHOD; import static org.jdbi.v3.core.internal.JdbiClassUtils.HASHCODE_METHOD; @@ -84,12 +83,17 @@ private Object createProxy(Jdbi jdbi, Class extensionType, Class... extraT } private static Object invoke(Object target, Method method, Object[] args) { - if (Proxy.isProxyClass(target.getClass())) { - InvocationHandler handler = Proxy.getInvocationHandler(target); - return Unchecked.function(params -> handler.invoke(target, method, params)).apply(args); - } else { - MethodHandle handle = Unchecked.function(MethodHandles.lookup()::unreflect).apply(method).bindTo(target); - return Unchecked.function(handle::invokeWithArguments).apply(args); + try { + if (Proxy.isProxyClass(target.getClass())) { + return Proxy.getInvocationHandler(target) + .invoke(target, method, args); + } else { + return MethodHandles.lookup().unreflect(method) + .bindTo(target) + .invokeWithArguments(args); + } + } catch (Throwable t) { + throw Sneaky.throwAnyway(t); } } From d8ba280dcc6939a8e30c43f922b7f648f4011663 Mon Sep 17 00:00:00 2001 From: Steven Schlansker Date: Thu, 13 Jul 2023 15:07:05 -0700 Subject: [PATCH 2/2] OnDemandExtensions.createProxy: Replace streams usage with simpler flat code --- .../v3/core/internal/OnDemandExtensions.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/org/jdbi/v3/core/internal/OnDemandExtensions.java b/core/src/main/java/org/jdbi/v3/core/internal/OnDemandExtensions.java index 11cd5529a1..95ccbc3a52 100644 --- a/core/src/main/java/org/jdbi/v3/core/internal/OnDemandExtensions.java +++ b/core/src/main/java/org/jdbi/v3/core/internal/OnDemandExtensions.java @@ -18,9 +18,8 @@ import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Arrays; +import java.util.LinkedHashSet; import java.util.Optional; -import java.util.function.Function; -import java.util.stream.Stream; import org.jdbi.v3.core.Jdbi; import org.jdbi.v3.core.config.JdbiConfig; @@ -72,14 +71,11 @@ private Object createProxy(Jdbi jdbi, Class extensionType, Class... extraT return jdbi.withExtension(extensionType, extension -> invoke(extension, method, args)); }; - Class[] types = Stream.of( - Stream.of(extensionType), - Arrays.stream(extensionType.getInterfaces()), - Arrays.stream(extraTypes)) - .flatMap(Function.identity()) - .distinct() - .toArray(Class[]::new); - return Proxy.newProxyInstance(extensionType.getClassLoader(), types, handler); + var types = new LinkedHashSet>(); + types.add(extensionType); + types.addAll(Arrays.asList(extensionType.getInterfaces())); + types.addAll(Arrays.asList(extraTypes)); + return Proxy.newProxyInstance(extensionType.getClassLoader(), types.toArray(new Class[0]), handler); } private static Object invoke(Object target, Method method, Object[] args) {