From ba9a87b02fb2b941797f76fcaf6fb36956ee16e7 Mon Sep 17 00:00:00 2001 From: Edgar Asatryan Date: Sat, 7 Nov 2026 22:38:37 +0400 Subject: [PATCH] perf: Use invokeExact for NodesFactory method handles Co-Authored-By: Claude Sonnet 5.5 --- .../rsql/parser/NodesFactoryAccess.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/cz/jirutka/rsql/parser/NodesFactoryAccess.java b/src/main/java/cz/jirutka/rsql/parser/NodesFactoryAccess.java index b192c43..fb6fcba 100644 --- a/src/main/java/cz/jirutka/rsql/parser/NodesFactoryAccess.java +++ b/src/main/java/cz/jirutka/rsql/parser/NodesFactoryAccess.java @@ -33,6 +33,7 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles.Lookup; +import java.lang.invoke.MethodType; import java.lang.reflect.Method; import java.util.List; import java.util.logging.Logger; @@ -45,19 +46,25 @@ final class NodesFactoryAccess { static { Lookup lookup = MethodHandles.lookup(); - LOGICAL_NODE_MH = methodHandle(lookup, "logicalNodeTrusted", LogicalOperator.class, List.class); - COMP_NODE_MH = methodHandle(lookup, "comparisonNodeTrusted", String.class, String.class, List.class); + LOGICAL_NODE_MH = methodHandle(lookup, "logicalNodeTrusted", LogicalNode.class, LogicalOperator.class, + List.class); + COMP_NODE_MH = methodHandle(lookup, "comparisonNodeTrusted", ComparisonNode.class, String.class, String.class, + List.class); } private NodesFactoryAccess() { } - private static MethodHandle methodHandle(Lookup lookup, String name, Class... parameterTypes) { + private static MethodHandle methodHandle(Lookup lookup, String name, Class returnType, + Class... parameterTypes) { try { Method m = NodesFactory.class.getDeclaredMethod(name, parameterTypes); m.setAccessible(true); - return lookup.unreflect(m); + MethodType exact = MethodType.methodType(returnType, parameterTypes) + .insertParameterTypes(0, NodesFactory.class); + + return lookup.unreflect(m).asType(exact); } catch (Throwable e) { logger().log(WARNING, "Unable to initialize MethodHandle for {0}", new Object[]{name, e}); } @@ -70,7 +77,7 @@ static LogicalNode create(NodesFactory factory, LogicalOperator operator, List