From a067a4c3cc03ff1a295c8bfabccd98bc689c58f5 Mon Sep 17 00:00:00 2001 From: Elon Azoulay Date: Sat, 2 Mar 2024 00:57:14 -0800 Subject: [PATCH] Cache types in ConstructorInstanceFactory --- .../reflect/ConstructorInstanceFactory.java | 41 +++---------------- 1 file changed, 6 insertions(+), 35 deletions(-) diff --git a/core/src/main/java/org/jdbi/v3/core/mapper/reflect/ConstructorInstanceFactory.java b/core/src/main/java/org/jdbi/v3/core/mapper/reflect/ConstructorInstanceFactory.java index 04b19d1b6..c498348d4 100644 --- a/core/src/main/java/org/jdbi/v3/core/mapper/reflect/ConstructorInstanceFactory.java +++ b/core/src/main/java/org/jdbi/v3/core/mapper/reflect/ConstructorInstanceFactory.java @@ -22,21 +22,16 @@ import java.lang.reflect.Type; import java.util.Arrays; import java.util.List; -import java.util.Map; -import java.util.WeakHashMap; import java.util.function.Supplier; import java.util.stream.Stream; import org.jdbi.v3.core.internal.exceptions.Unchecked; -import static java.util.Collections.synchronizedMap; import static java.util.Objects.requireNonNull; import static java.util.stream.Collectors.toUnmodifiableList; class ConstructorInstanceFactory extends InstanceFactory { private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); - private static final Map CONSTRUCTOR_CACHE = synchronizedMap(new WeakHashMap<>()); - private final Constructor constructor; private final List types; private final MethodHandle constructorHandle; @@ -44,9 +39,8 @@ class ConstructorInstanceFactory extends InstanceFactory { ConstructorInstanceFactory(Constructor constructor) { super(constructor); this.constructor = requireNonNull(constructor, "constructor is null"); - ConstructorHandleAndTypes constructorHandleAndTypes = getConstructorHandleAndTypes(constructor, super::getTypes); - this.types = constructorHandleAndTypes.getTypes(); - this.constructorHandle = constructorHandleAndTypes.getConstructorHandle(); + this.types = extractTypes(constructor, super::getTypes); + this.constructorHandle = getConstructorMethodHandle(constructor); } @Override @@ -88,18 +82,13 @@ private static boolean isGenericInformationLost(Constructor factory) { return lossDetected; } - private static ConstructorHandleAndTypes getConstructorHandleAndTypes(Constructor constructor, Supplier> defaultSupplier) { - return CONSTRUCTOR_CACHE.computeIfAbsent(constructor, ctor -> computeConstructorHandleAndTypes(ctor, defaultSupplier)); - } - - private static ConstructorHandleAndTypes computeConstructorHandleAndTypes(Constructor constructor, Supplier> defaultSupplier) { - MethodHandle constructorMethodHandle = getConstructorMethodHandle(constructor); + private static List extractTypes(Constructor constructor, Supplier> defaultSupplier) { if (isGenericInformationLost(constructor)) { - return new ConstructorHandleAndTypes(constructorMethodHandle, getFields(constructor) + return getFields(constructor) .map(Field::getGenericType) - .collect(toUnmodifiableList())); + .collect(toUnmodifiableList()); } - return new ConstructorHandleAndTypes(constructorMethodHandle, defaultSupplier.get()); + return defaultSupplier.get(); } private static MethodHandle getConstructorMethodHandle(Constructor constructor) { @@ -114,22 +103,4 @@ private static Stream getFields(Constructor constructor) { return Arrays.stream(constructor.getDeclaringClass().getDeclaredFields()) .filter(field -> !Modifier.isStatic(field.getModifiers())); } - - private static class ConstructorHandleAndTypes { - private final MethodHandle constructorHandle; - private final List types; - - ConstructorHandleAndTypes(MethodHandle constructorHandle, List types) { - this.constructorHandle = requireNonNull(constructorHandle, "constructorHandle is null"); - this.types = requireNonNull(types, "types is null"); - } - - public MethodHandle getConstructorHandle() { - return constructorHandle; - } - - public List getTypes() { - return types; - } - } }