From: Robert Varga Date: Wed, 8 Dec 2021 16:03:25 +0000 (+0100) Subject: Do no use reflection to obtain opaque value ctor X-Git-Tag: v9.0.0~80 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F30%2F98930%2F1;p=mdsal.git 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 --- 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); } }