From 03d89c222279a8f1d9b70061a0e5e36c6fcf88fc Mon Sep 17 00:00:00 2001 From: Carl Mastrangelo Date: Thu, 17 Aug 2017 20:17:36 -0700 Subject: [PATCH] Use Constructor for reflective class instantiation. Motivation: Calling `newInstance()` on a Class object can bypass compile time checked Exception propagation. This is noted in Java Puzzlers, as well as in ErrorProne: http://errorprone.info/bugpattern/ClassNewInstance Modifications: Use the niladic constructor to create a new instance. Result: Compile time safety for checked exceptions --- .../io/netty/handler/codec/protobuf/ProtobufDecoderNano.java | 2 +- .../src/test/java/io/netty/test/udt/util/CaliperRunner.java | 2 +- .../main/java/io/netty/channel/ReflectiveChannelFactory.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufDecoderNano.java b/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufDecoderNano.java index 9310bbf341..5144b5fa3d 100644 --- a/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufDecoderNano.java +++ b/codec/src/main/java/io/netty/handler/codec/protobuf/ProtobufDecoderNano.java @@ -82,7 +82,7 @@ public class ProtobufDecoderNano extends MessageToMessageDecoder { msg.getBytes(msg.readerIndex(), array, 0, length); offset = 0; } - MessageNano prototype = clazz.newInstance(); + MessageNano prototype = clazz.getConstructor().newInstance(); out.add(MessageNano.mergeFrom(prototype, array, offset, length)); } } diff --git a/transport-udt/src/test/java/io/netty/test/udt/util/CaliperRunner.java b/transport-udt/src/test/java/io/netty/test/udt/util/CaliperRunner.java index 819142f7ca..fa4f9c5963 100644 --- a/transport-udt/src/test/java/io/netty/test/udt/util/CaliperRunner.java +++ b/transport-udt/src/test/java/io/netty/test/udt/util/CaliperRunner.java @@ -78,7 +78,7 @@ public final class CaliperRunner { public static Run execute(final String name, final Class klaz) throws Exception { - final CaliperBench booter = klaz.newInstance(); + final CaliperBench booter = klaz.getConstructor().newInstance(); final List> varsSet = product(booter); diff --git a/transport/src/main/java/io/netty/channel/ReflectiveChannelFactory.java b/transport/src/main/java/io/netty/channel/ReflectiveChannelFactory.java index 0db431bbb0..502d15f173 100644 --- a/transport/src/main/java/io/netty/channel/ReflectiveChannelFactory.java +++ b/transport/src/main/java/io/netty/channel/ReflectiveChannelFactory.java @@ -35,7 +35,7 @@ public class ReflectiveChannelFactory implements ChannelFacto @Override public T newChannel() { try { - return clazz.newInstance(); + return clazz.getConstructor().newInstance(); } catch (Throwable t) { throw new ChannelException("Unable to create Channel from class " + clazz, t); }