From c95e5240ca83def4357e8ca7c45b71ea33e9f973 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 8 Dec 2021 17:03:25 +0100 Subject: [PATCH] Do no use reflection to obtain opaque value ctor We can do all the lookups and access via java.lang.invoke, let's not bring java.lang.reflect to the party. Change-Id: I7528a469270d384fbbbd9680cffe227129cf4d39 Signed-off-by: Robert Varga --- .../dom/codec/impl/OpaqueNodeCodecContext.java | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/OpaqueNodeCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/OpaqueNodeCodecContext.java index 3144e17fd4..f26fb25bd0 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/OpaqueNodeCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/OpaqueNodeCodecContext.java @@ -15,7 +15,6 @@ import com.google.common.base.Throwables; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; -import java.lang.reflect.Constructor; import javax.xml.transform.dom.DOMSource; import net.bytebuddy.ByteBuddy; import net.bytebuddy.dynamic.DynamicType.Builder; @@ -78,8 +77,8 @@ abstract class OpaqueNodeCodecContext> extends ValueNo } } - private static final MethodType CONSTRUCTOR_TYPE = MethodType.methodType(OpaqueObject.class, - OpaqueData.class); + private static final MethodType CTOR_LOOKUP_TYPE = MethodType.methodType(void.class, OpaqueData.class); + private static final MethodType CTOR_INVOKE_TYPE = MethodType.methodType(OpaqueObject.class, OpaqueData.class); @SuppressWarnings("rawtypes") private static final Builder TEMPLATE = new ByteBuddy().subclass(CodecOpaqueObject.class) .modifiers(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL | Opcodes.ACC_SYNTHETIC); @@ -163,15 +162,9 @@ abstract class OpaqueNodeCodecContext> extends ValueNo .implement(bindingInterface) .make())); - Constructor ctor; try { - ctor = proxyClass.getDeclaredConstructor(OpaqueData.class); - } catch (NoSuchMethodException e) { - throw new LinkageError("Failed to acquire constructor for prototype " + proxyClass, e); - } - try { - return MethodHandles.publicLookup().unreflectConstructor(ctor).asType(CONSTRUCTOR_TYPE); - } catch (IllegalAccessException e) { + return MethodHandles.publicLookup().findConstructor(proxyClass, CTOR_LOOKUP_TYPE).asType(CTOR_INVOKE_TYPE); + } catch (IllegalAccessException | NoSuchMethodException e) { throw new LinkageError("Failed to access constructor for prototype " + proxyClass, e); } } -- 2.36.6