Do no use reflection to obtain opaque value ctor 10/98910/1
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 8 Dec 2021 16:03:25 +0000 (17:03 +0100)
committerRobert Varga <nite@hq.sk>
Wed, 8 Dec 2021 22:49:55 +0000 (22:49 +0000)
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 <robert.varga@pantheon.tech>
(cherry picked from commit c95e5240ca83def4357e8ca7c45b71ea33e9f973)

binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/OpaqueNodeCodecContext.java

index 3144e17fd4dc3b380873d8bdaaa2401047d66520..f26fb25bd0011fded232834f4c5dd8d1e945e076 100644 (file)
@@ -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<T extends OpaqueObject<T>> 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<CodecOpaqueObject> TEMPLATE = new ByteBuddy().subclass(CodecOpaqueObject.class)
             .modifiers(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL | Opcodes.ACC_SYNTHETIC);
@@ -163,15 +162,9 @@ abstract class OpaqueNodeCodecContext<T extends OpaqueObject<T>> 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);
         }
     }