From c424599593b0feee6bb76735cd60ad8f151d21fb Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Tue, 15 Jan 2019 08:38:13 +0100 Subject: [PATCH] Access the Constructor of the Channel in the constructor of ReflectiveChannelFactory. (#8718) Motivation: We should access the Constructor of the passed in class in the Constructor of ReflectiveChannelFactory only to reduce the overhead but also fail-fast. Modifications: Access the Constructor early. Result: Fails fast and less performance overhead. --- .../channel/ReflectiveChannelFactory.java | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/transport/src/main/java/io/netty/channel/ReflectiveChannelFactory.java b/transport/src/main/java/io/netty/channel/ReflectiveChannelFactory.java index 502d15f173..677c1c071d 100644 --- a/transport/src/main/java/io/netty/channel/ReflectiveChannelFactory.java +++ b/transport/src/main/java/io/netty/channel/ReflectiveChannelFactory.java @@ -16,33 +16,40 @@ package io.netty.channel; +import io.netty.util.internal.ObjectUtil; import io.netty.util.internal.StringUtil; +import java.lang.reflect.Constructor; + /** * A {@link ChannelFactory} that instantiates a new {@link Channel} by invoking its default constructor reflectively. */ public class ReflectiveChannelFactory implements ChannelFactory { - private final Class clazz; + private final Constructor constructor; public ReflectiveChannelFactory(Class clazz) { - if (clazz == null) { - throw new NullPointerException("clazz"); + ObjectUtil.checkNotNull(clazz, "clazz"); + try { + this.constructor = clazz.getConstructor(); + } catch (NoSuchMethodException e) { + throw new IllegalArgumentException("Class " + StringUtil.simpleClassName(clazz) + + " does not have a public non-arg constructor", e); } - this.clazz = clazz; } @Override public T newChannel() { try { - return clazz.getConstructor().newInstance(); + return constructor.newInstance(); } catch (Throwable t) { - throw new ChannelException("Unable to create Channel from class " + clazz, t); + throw new ChannelException("Unable to create Channel from class " + constructor.getDeclaringClass(), t); } } @Override public String toString() { - return StringUtil.simpleClassName(clazz) + ".class"; + return StringUtil.simpleClassName(ReflectiveChannelFactory.class) + + '(' + StringUtil.simpleClassName(constructor.getDeclaringClass()) + ".class)"; } }