You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by md...@apache.org on 2018/03/14 18:27:58 UTC

[1/3] hbase git commit: HBASE-20180 Avoid Class::newInstance

Repository: hbase
Updated Branches:
  refs/heads/branch-2 ad425e860 -> 5e2f8e402
  refs/heads/branch-2.0 bceacf333 -> 1cb2f83ee
  refs/heads/master 37342220b -> f63a7ff63


HBASE-20180 Avoid Class::newInstance


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/5e2f8e40
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/5e2f8e40
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/5e2f8e40

Branch: refs/heads/branch-2
Commit: 5e2f8e4023e362f033e3115c5c3a6812e6764633
Parents: ad425e8
Author: Mike Drob <md...@apache.org>
Authored: Mon Mar 12 16:05:39 2018 -0500
Committer: Mike Drob <md...@apache.org>
Committed: Wed Mar 14 12:23:38 2018 -0500

----------------------------------------------------------------------
 hbase-build-configuration/pom.xml               |  1 +
 .../coprocessor/AggregateImplementation.java    | 15 +++--
 .../mapreduce/MultithreadedTableMapper.java     |  3 +-
 .../mapreduce/TableSnapshotInputFormatImpl.java | 17 ++----
 .../hadoop/hbase/constraint/Constraints.java    | 10 ++--
 .../hbase/master/MasterCoprocessorHost.java     | 28 +++++----
 .../replication/ReplicationPeerManager.java     |  4 +-
 .../hbase/regionserver/RSRpcServices.java       | 13 ++--
 .../regionserver/RegionCoprocessorHost.java     | 28 +++++----
 .../RegionServerCoprocessorHost.java            | 29 +++++----
 .../regionserver/wal/WALCoprocessorHost.java    | 11 +++-
 .../regionserver/ReplicationSource.java         | 18 ++++--
 .../regionserver/ReplicationSourceFactory.java  |  5 +-
 .../hbase/coprocessor/TestCoprocessorHost.java  | 62 ++++++++++++--------
 14 files changed, 145 insertions(+), 99 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/5e2f8e40/hbase-build-configuration/pom.xml
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/pom.xml b/hbase-build-configuration/pom.xml
index 5a19304..cf688cb 100644
--- a/hbase-build-configuration/pom.xml
+++ b/hbase-build-configuration/pom.xml
@@ -83,6 +83,7 @@
               <compilerArgs>
                 <arg>-XepDisableWarningsInGeneratedCode</arg>
                 <arg>-Xep:FallThrough:OFF</arg> <!-- already in findbugs -->
+                <arg>-Xep:ClassNewInstance:ERROR</arg>
               </compilerArgs>
               <annotationProcessorPaths>
                 <path>

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e2f8e40/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java
----------------------------------------------------------------------
diff --git a/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java b/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java
index 6beb3f6..c8badd3 100644
--- a/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java
+++ b/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java
@@ -27,6 +27,7 @@ import com.google.protobuf.RpcController;
 import com.google.protobuf.Service;
 
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -480,21 +481,19 @@ extends AggregateService implements RegionCoprocessor {
   ColumnInterpreter<T,S,P,Q,R> constructColumnInterpreterFromRequest(
       AggregateRequest request) throws IOException {
     String className = request.getInterpreterClassName();
-    Class<?> cls;
     try {
-      cls = Class.forName(className);
-      ColumnInterpreter<T,S,P,Q,R> ci = (ColumnInterpreter<T, S, P, Q, R>) cls.newInstance();
+      ColumnInterpreter<T,S,P,Q,R> ci;
+      Class<?> cls = Class.forName(className);
+      ci = (ColumnInterpreter<T, S, P, Q, R>) cls.getDeclaredConstructor().newInstance();
+
       if (request.hasInterpreterSpecificBytes()) {
         ByteString b = request.getInterpreterSpecificBytes();
         P initMsg = getParsedGenericInstance(ci.getClass(), 2, b);
         ci.initialize(initMsg);
       }
       return ci;
-    } catch (ClassNotFoundException e) {
-      throw new IOException(e);
-    } catch (InstantiationException e) {
-      throw new IOException(e);
-    } catch (IllegalAccessException e) {
+    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException |
+        NoSuchMethodException | InvocationTargetException e) {
       throw new IOException(e);
     }
   }

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e2f8e40/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java
----------------------------------------------------------------------
diff --git a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java
index 626deff..5cd87ae 100644
--- a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java
+++ b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java
@@ -281,7 +281,8 @@ public class MultithreadedTableMapper<K2, V2> extends TableMapper<K2, V2> {
             outer.getInputSplit());
           Class<?> wrappedMapperClass = Class.forName("org.apache.hadoop.mapreduce.lib.map.WrappedMapper");
           Method getMapContext = wrappedMapperClass.getMethod("getMapContext", MapContext.class);
-          subcontext = (Context) getMapContext.invoke(wrappedMapperClass.newInstance(), mc);
+          subcontext = (Context) getMapContext.invoke(
+              wrappedMapperClass.getDeclaredConstructor().newInstance(), mc);
         } catch (Exception ee) { // FindBugs: REC_CATCH_EXCEPTION
           // rethrow as IOE
           throw new IOException(e);

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e2f8e40/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
----------------------------------------------------------------------
diff --git a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
index add0985f..1795ce1 100644
--- a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
+++ b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
@@ -22,6 +22,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
@@ -300,17 +301,11 @@ public class TableSnapshotInputFormatImpl {
     if (splitAlgoClassName == null)
       return null;
     try {
-      return ((Class<? extends RegionSplitter.SplitAlgorithm>)
-              Class.forName(splitAlgoClassName)).newInstance();
-    } catch (ClassNotFoundException e) {
-      throw new IOException("SplitAlgo class " + splitAlgoClassName +
-              " is not found", e);
-    } catch (InstantiationException e) {
-      throw new IOException("SplitAlgo class " + splitAlgoClassName +
-              " is not instantiable", e);
-    } catch (IllegalAccessException e) {
-      throw new IOException("SplitAlgo class " + splitAlgoClassName +
-              " is not instantiable", e);
+      return Class.forName(splitAlgoClassName).asSubclass(RegionSplitter.SplitAlgorithm.class)
+          .getDeclaredConstructor().newInstance();
+    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException |
+        NoSuchMethodException | InvocationTargetException e) {
+      throw new IOException("SplitAlgo class " + splitAlgoClassName + " is not found", e);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e2f8e40/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java
index 426e516..759d252 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java
@@ -21,6 +21,7 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -593,14 +594,11 @@ public final class Constraints {
           // add the constraint, now that we expect it to be valid.
           Class<? extends Constraint> clazz = classloader.loadClass(key)
               .asSubclass(Constraint.class);
-          Constraint constraint = clazz.newInstance();
+          Constraint constraint = clazz.getDeclaredConstructor().newInstance();
           constraint.setConf(conf);
           constraints.add(constraint);
-        } catch (ClassNotFoundException e1) {
-          throw new IOException(e1);
-        } catch (InstantiationException e1) {
-          throw new IOException(e1);
-        } catch (IllegalAccessException e1) {
+        } catch (InvocationTargetException | NoSuchMethodException | ClassNotFoundException |
+            InstantiationException | IllegalAccessException e1) {
           throw new IOException(e1);
         }
       }

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e2f8e40/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
index 7f17227..8c8c02c 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
@@ -20,6 +20,7 @@ package org.apache.hadoop.hbase.master;
 
 import com.google.protobuf.Service;
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.util.List;
 import java.util.Set;
 import org.apache.hadoop.conf.Configuration;
@@ -170,17 +171,22 @@ public class MasterCoprocessorHost
   @Override
   public MasterCoprocessor checkAndGetInstance(Class<?> implClass)
       throws InstantiationException, IllegalAccessException {
-    if (MasterCoprocessor.class.isAssignableFrom(implClass)) {
-      return (MasterCoprocessor)implClass.newInstance();
-    } else if (CoprocessorService.class.isAssignableFrom(implClass)) {
-      // For backward compatibility with old CoprocessorService impl which don't extend
-      // MasterCoprocessor.
-      return new CoprocessorServiceBackwardCompatiblity.MasterCoprocessorService(
-          (CoprocessorService)implClass.newInstance());
-    } else {
-      LOG.error(implClass.getName() + " is not of type MasterCoprocessor. Check the "
-          + "configuration " + CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY);
-      return null;
+    try {
+      if (MasterCoprocessor.class.isAssignableFrom(implClass)) {
+        return implClass.asSubclass(MasterCoprocessor.class).getDeclaredConstructor().newInstance();
+      } else if (CoprocessorService.class.isAssignableFrom(implClass)) {
+        // For backward compatibility with old CoprocessorService impl which don't extend
+        // MasterCoprocessor.
+        CoprocessorService cs;
+        cs = implClass.asSubclass(CoprocessorService.class).getDeclaredConstructor().newInstance();
+        return new CoprocessorServiceBackwardCompatiblity.MasterCoprocessorService(cs);
+      } else {
+        LOG.error("{} is not of type MasterCoprocessor. Check the configuration of {}",
+            implClass.getName(), CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY);
+        return null;
+      }
+    } catch (NoSuchMethodException | InvocationTargetException e) {
+      throw (InstantiationException) new InstantiationException(implClass.getName()).initCause(e);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e2f8e40/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.java
index 19fc7f4..19cd89d 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.java
@@ -310,10 +310,10 @@ public class ReplicationPeerManager {
       String[] filters = filterCSV.split(",");
       for (String filter : filters) {
         try {
-          Class.forName(filter).newInstance();
+          Class.forName(filter).getDeclaredConstructor().newInstance();
         } catch (Exception e) {
           throw new DoNotRetryIOException("Configured WALEntryFilter " + filter +
-            " could not be created. Failing add/update " + "peer operation.", e);
+            " could not be created. Failing add/update peer operation.", e);
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e2f8e40/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
index 5110939..088cdc3 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
@@ -20,6 +20,7 @@ package org.apache.hadoop.hbase.regionserver;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InterruptedIOException;
+import java.lang.reflect.InvocationTargetException;
 import java.net.BindException;
 import java.net.InetSocketAddress;
 import java.net.UnknownHostException;
@@ -1185,11 +1186,13 @@ public class RSRpcServices implements HBaseRPCErrorHandler,
     rowSizeWarnThreshold = rs.conf.getInt(BATCH_ROWS_THRESHOLD_NAME, BATCH_ROWS_THRESHOLD_DEFAULT);
     RpcSchedulerFactory rpcSchedulerFactory;
     try {
-      Class<?> rpcSchedulerFactoryClass = rs.conf.getClass(
+      Class<?> cls = rs.conf.getClass(
           REGION_SERVER_RPC_SCHEDULER_FACTORY_CLASS,
           SimpleRpcSchedulerFactory.class);
-      rpcSchedulerFactory = ((RpcSchedulerFactory) rpcSchedulerFactoryClass.newInstance());
-    } catch (InstantiationException | IllegalAccessException e) {
+      rpcSchedulerFactory = cls.asSubclass(RpcSchedulerFactory.class)
+          .getDeclaredConstructor().newInstance();
+    } catch (NoSuchMethodException | InvocationTargetException |
+        InstantiationException | IllegalAccessException e) {
       throw new IllegalArgumentException(e);
     }
     // Server to handle client requests.
@@ -3534,8 +3537,8 @@ public class RSRpcServices implements HBaseRPCErrorHandler,
         for (RemoteProcedureRequest req : request.getProcList()) {
           RSProcedureCallable callable;
           try {
-            callable =
-              Class.forName(req.getProcClass()).asSubclass(RSProcedureCallable.class).newInstance();
+            callable = Class.forName(req.getProcClass()).asSubclass(RSProcedureCallable.class)
+              .getDeclaredConstructor().newInstance();
           } catch (Exception e) {
             regionServer.remoteProcedureComplete(req.getProcId(), e);
             continue;

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e2f8e40/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
index 47b389a..b35f4fb 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
@@ -22,6 +22,7 @@ import com.google.protobuf.Message;
 import com.google.protobuf.Service;
 
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -465,17 +466,22 @@ public class RegionCoprocessorHost
   @Override
   public RegionCoprocessor checkAndGetInstance(Class<?> implClass)
       throws InstantiationException, IllegalAccessException {
-    if (RegionCoprocessor.class.isAssignableFrom(implClass)) {
-      return (RegionCoprocessor)implClass.newInstance();
-    } else if (CoprocessorService.class.isAssignableFrom(implClass)) {
-      // For backward compatibility with old CoprocessorService impl which don't extend
-      // RegionCoprocessor.
-      return new CoprocessorServiceBackwardCompatiblity.RegionCoprocessorService(
-          (CoprocessorService)implClass.newInstance());
-    } else {
-      LOG.error(implClass.getName() + " is not of type RegionCoprocessor. Check the "
-          + "configuration " + CoprocessorHost.REGION_COPROCESSOR_CONF_KEY);
-      return null;
+    try {
+      if (RegionCoprocessor.class.isAssignableFrom(implClass)) {
+        return implClass.asSubclass(RegionCoprocessor.class).getDeclaredConstructor().newInstance();
+      } else if (CoprocessorService.class.isAssignableFrom(implClass)) {
+        // For backward compatibility with old CoprocessorService impl which don't extend
+        // RegionCoprocessor.
+        CoprocessorService cs;
+        cs = implClass.asSubclass(CoprocessorService.class).getDeclaredConstructor().newInstance();
+        return new CoprocessorServiceBackwardCompatiblity.RegionCoprocessorService(cs);
+      } else {
+        LOG.error("{} is not of type RegionCoprocessor. Check the configuration of {}",
+            implClass.getName(), CoprocessorHost.REGION_COPROCESSOR_CONF_KEY);
+        return null;
+      }
+    } catch (NoSuchMethodException | InvocationTargetException e) {
+      throw (InstantiationException) new InstantiationException(implClass.getName()).initCause(e);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e2f8e40/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java
index f4122ce..42a4e00 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java
@@ -19,6 +19,7 @@
 package org.apache.hadoop.hbase.regionserver;
 
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 
 import com.google.protobuf.Service;
 
@@ -82,17 +83,23 @@ public class RegionServerCoprocessorHost extends
   @Override
   public RegionServerCoprocessor checkAndGetInstance(Class<?> implClass)
       throws InstantiationException, IllegalAccessException {
-    if (RegionServerCoprocessor.class.isAssignableFrom(implClass)) {
-      return (RegionServerCoprocessor)implClass.newInstance();
-    } else if (SingletonCoprocessorService.class.isAssignableFrom(implClass)) {
-      // For backward compatibility with old CoprocessorService impl which don't extend
-      // RegionCoprocessor.
-      return new CoprocessorServiceBackwardCompatiblity.RegionServerCoprocessorService(
-          (SingletonCoprocessorService)implClass.newInstance());
-    } else {
-      LOG.error(implClass.getName() + " is not of type RegionServerCoprocessor. Check the "
-          + "configuration " + CoprocessorHost.REGIONSERVER_COPROCESSOR_CONF_KEY);
-      return null;
+    try {
+      if (RegionServerCoprocessor.class.isAssignableFrom(implClass)) {
+        return implClass.asSubclass(RegionServerCoprocessor.class).getDeclaredConstructor()
+            .newInstance();
+      } else if (SingletonCoprocessorService.class.isAssignableFrom(implClass)) {
+        // For backward compatibility with old CoprocessorService impl which don't extend
+        // RegionCoprocessor.
+        SingletonCoprocessorService tmp = implClass.asSubclass(SingletonCoprocessorService.class)
+            .getDeclaredConstructor().newInstance();
+        return new CoprocessorServiceBackwardCompatiblity.RegionServerCoprocessorService(tmp);
+      } else {
+        LOG.error("{} is not of type RegionServerCoprocessor. Check the configuration of {}",
+            implClass.getName(), CoprocessorHost.REGIONSERVER_COPROCESSOR_CONF_KEY);
+        return null;
+      }
+    } catch (NoSuchMethodException | InvocationTargetException e) {
+      throw (InstantiationException) new InstantiationException(implClass.getName()).initCause(e);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e2f8e40/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java
index 7b6182e..40d6d0f 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java
@@ -21,6 +21,7 @@
 package org.apache.hadoop.hbase.regionserver.wal;
 
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.Path;
@@ -118,10 +119,14 @@ public class WALCoprocessorHost
   }
 
   @Override
-  public WALCoprocessor checkAndGetInstance(Class<?> implClass)
-      throws InstantiationException, IllegalAccessException {
+  public WALCoprocessor checkAndGetInstance(Class<?> implClass) throws IllegalAccessException,
+      InstantiationException {
     if (WALCoprocessor.class.isAssignableFrom(implClass)) {
-      return (WALCoprocessor)implClass.newInstance();
+      try {
+        return implClass.asSubclass(WALCoprocessor.class).getDeclaredConstructor().newInstance();
+      } catch (NoSuchMethodException | InvocationTargetException e) {
+        throw (InstantiationException) new InstantiationException(implClass.getName()).initCause(e);
+      }
     } else {
       LOG.error(implClass.getName() + " is not of type WALCoprocessor. Check the "
           + "configuration " + CoprocessorHost.WAL_COPROCESSOR_CONF_KEY);

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e2f8e40/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSource.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSource.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSource.java
index 09b6cc1..73d4652 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSource.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSource.java
@@ -18,6 +18,7 @@
 package org.apache.hadoop.hbase.replication.regionserver;
 
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Comparator;
@@ -242,12 +243,21 @@ public class ReplicationSource implements ReplicationSourceInterface {
       rsServerHost = ((HRegionServer) server).getRegionServerCoprocessorHost();
     }
     String replicationEndpointImpl = replicationPeer.getPeerConfig().getReplicationEndpointImpl();
+
+    ReplicationEndpoint replicationEndpoint;
     if (replicationEndpointImpl == null) {
-      // Default to HBase inter-cluster replication endpoint
-      replicationEndpointImpl = HBaseInterClusterReplicationEndpoint.class.getName();
+      // Default to HBase inter-cluster replication endpoint; skip reflection
+      replicationEndpoint = new HBaseInterClusterReplicationEndpoint();
+    } else {
+      try {
+        replicationEndpoint = Class.forName(replicationEndpointImpl)
+            .asSubclass(ReplicationEndpoint.class)
+            .getDeclaredConstructor()
+            .newInstance();
+      } catch (NoSuchMethodException | InvocationTargetException e) {
+        throw new IllegalArgumentException(e);
+      }
     }
-    ReplicationEndpoint replicationEndpoint =
-      Class.forName(replicationEndpointImpl).asSubclass(ReplicationEndpoint.class).newInstance();
     if (rsServerHost != null) {
       ReplicationEndpoint newReplicationEndPoint =
         rsServerHost.postCreateReplicationEndPoint(replicationEndpoint);

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e2f8e40/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java
index 93e8331..d613049 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java
@@ -40,10 +40,9 @@ public class ReplicationSourceFactory {
       String defaultReplicationSourceImpl =
           isQueueRecovered ? RecoveredReplicationSource.class.getCanonicalName()
               : ReplicationSource.class.getCanonicalName();
-      @SuppressWarnings("rawtypes")
-      Class c = Class.forName(
+      Class<?> c = Class.forName(
         conf.get("replication.replicationsource.implementation", defaultReplicationSourceImpl));
-      src = (ReplicationSourceInterface) c.newInstance();
+      src = c.asSubclass(ReplicationSourceInterface.class).getDeclaredConstructor().newInstance();
     } catch (Exception e) {
       LOG.warn("Passed replication source implementation throws errors, "
           + "defaulting to ReplicationSource",

http://git-wip-us.apache.org/repos/asf/hbase/blob/5e2f8e40/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.java
index c541647..3cf2221 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.java
@@ -20,6 +20,8 @@ package org.apache.hadoop.hbase.coprocessor;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
+import java.lang.reflect.InvocationTargetException;
+
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.Abortable;
 import org.apache.hadoop.hbase.Coprocessor;
@@ -56,47 +58,61 @@ public class TestCoprocessorHost {
       return this.aborted;
     }
   }
+
   @Test
   public void testDoubleLoadingAndPriorityValue() {
     final Configuration conf = HBaseConfiguration.create();
-    CoprocessorHost<RegionCoprocessor, CoprocessorEnvironment<RegionCoprocessor>> host =
-        new CoprocessorHost<RegionCoprocessor, CoprocessorEnvironment<RegionCoprocessor>>(
-            new TestAbortable()) {
-          @Override
-          public RegionCoprocessor checkAndGetInstance(Class<?> implClass)
-              throws InstantiationException, IllegalAccessException {
-            if(RegionCoprocessor.class.isAssignableFrom(implClass)) {
-              return (RegionCoprocessor)implClass.newInstance();
-            }
-            return null;
-          }
-
-          final Configuration cpHostConf = conf;
-
-      @Override
-      public CoprocessorEnvironment<RegionCoprocessor> createEnvironment(
-          final RegionCoprocessor instance, final int priority, int sequence, Configuration conf) {
-        return new BaseEnvironment<RegionCoprocessor>(instance, priority, 0, cpHostConf);
-      }
-    };
     final String key = "KEY";
     final String coprocessor = "org.apache.hadoop.hbase.coprocessor.SimpleRegionObserver";
+
+    CoprocessorHost<RegionCoprocessor, CoprocessorEnvironment<RegionCoprocessor>> host;
+    host = new CoprocessorHostForTest<>(conf);
+
     // Try and load a coprocessor three times
     conf.setStrings(key, coprocessor, coprocessor, coprocessor,
         SimpleRegionObserverV2.class.getName());
     host.loadSystemCoprocessors(conf, key);
+
     // Two coprocessors(SimpleRegionObserver and SimpleRegionObserverV2) loaded
     Assert.assertEquals(2, host.coprocEnvironments.size());
+
     // Check the priority value
-    CoprocessorEnvironment simpleEnv = host.findCoprocessorEnvironment(
+    CoprocessorEnvironment<?> simpleEnv = host.findCoprocessorEnvironment(
         SimpleRegionObserver.class.getName());
-    CoprocessorEnvironment simpleEnv_v2 = host.findCoprocessorEnvironment(
+    CoprocessorEnvironment<?> simpleEnv_v2 = host.findCoprocessorEnvironment(
         SimpleRegionObserverV2.class.getName());
+
     assertNotNull(simpleEnv);
     assertNotNull(simpleEnv_v2);
     assertEquals(Coprocessor.PRIORITY_SYSTEM, simpleEnv.getPriority());
     assertEquals(Coprocessor.PRIORITY_SYSTEM + 1, simpleEnv_v2.getPriority());
   }
-  public static class SimpleRegionObserverV2 extends SimpleRegionObserver {
+
+  public static class SimpleRegionObserverV2 extends SimpleRegionObserver { }
+
+  private static class CoprocessorHostForTest<E extends Coprocessor> extends
+      CoprocessorHost<E, CoprocessorEnvironment<E>> {
+    final Configuration cpHostConf;
+
+    public CoprocessorHostForTest(Configuration conf) {
+      super(new TestAbortable());
+      cpHostConf = conf;
+    }
+
+    @Override
+    public E checkAndGetInstance(Class<?> implClass)
+        throws InstantiationException, IllegalAccessException {
+      try {
+        return (E) implClass.getDeclaredConstructor().newInstance();
+      } catch (InvocationTargetException | NoSuchMethodException e) {
+        throw (InstantiationException) new InstantiationException().initCause(e);
+      }
+    }
+
+    @Override
+    public CoprocessorEnvironment<E> createEnvironment(final E instance, final int priority,
+        int sequence, Configuration conf) {
+      return new BaseEnvironment<>(instance, priority, 0, cpHostConf);
+    }
   }
 }


[3/3] hbase git commit: HBASE-20180 Avoid Class::newInstance

Posted by md...@apache.org.
HBASE-20180 Avoid Class::newInstance


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/f63a7ff6
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/f63a7ff6
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/f63a7ff6

Branch: refs/heads/master
Commit: f63a7ff635fa02a8a97d9a36505732f647d2e7ff
Parents: 3734222
Author: Mike Drob <md...@apache.org>
Authored: Mon Mar 12 16:05:39 2018 -0500
Committer: Mike Drob <md...@apache.org>
Committed: Wed Mar 14 13:15:05 2018 -0500

----------------------------------------------------------------------
 .../hbase/backup/BackupClientFactory.java       |  5 +-
 hbase-build-configuration/pom.xml               |  1 +
 .../coprocessor/AggregateImplementation.java    | 15 +++--
 .../mapreduce/MultithreadedTableMapper.java     |  3 +-
 .../mapreduce/TableSnapshotInputFormatImpl.java | 17 ++----
 .../hadoop/hbase/constraint/Constraints.java    | 10 ++--
 .../hbase/master/MasterCoprocessorHost.java     | 28 +++++----
 .../replication/ReplicationPeerManager.java     |  4 +-
 .../hbase/regionserver/RSRpcServices.java       | 13 ++--
 .../regionserver/RegionCoprocessorHost.java     | 28 +++++----
 .../RegionServerCoprocessorHost.java            | 29 +++++----
 .../regionserver/wal/WALCoprocessorHost.java    | 11 +++-
 .../regionserver/ReplicationSource.java         | 18 ++++--
 .../regionserver/ReplicationSourceFactory.java  |  5 +-
 .../hbase/coprocessor/TestCoprocessorHost.java  | 62 ++++++++++++--------
 15 files changed, 148 insertions(+), 101 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/BackupClientFactory.java
----------------------------------------------------------------------
diff --git a/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/BackupClientFactory.java b/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/BackupClientFactory.java
index 4c96229..e3abb60 100644
--- a/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/BackupClientFactory.java
+++ b/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/BackupClientFactory.java
@@ -38,8 +38,9 @@ public final class BackupClientFactory {
     try {
       String clsName = conf.get(TableBackupClient.BACKUP_CLIENT_IMPL_CLASS);
       if (clsName != null) {
-        Class<?> clientImpl = Class.forName(clsName);
-        TableBackupClient client = (TableBackupClient) clientImpl.newInstance();
+        Class<? extends TableBackupClient> clientImpl;
+        clientImpl = Class.forName(clsName).asSubclass(TableBackupClient.class);
+        TableBackupClient client = clientImpl.getDeclaredConstructor().newInstance();
         client.init(conn, backupId, request);
         return client;
       }

http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-build-configuration/pom.xml
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/pom.xml b/hbase-build-configuration/pom.xml
index ac98044..311b1c0 100644
--- a/hbase-build-configuration/pom.xml
+++ b/hbase-build-configuration/pom.xml
@@ -82,6 +82,7 @@
               <compilerArgs>
                 <arg>-XepDisableWarningsInGeneratedCode</arg>
                 <arg>-Xep:FallThrough:OFF</arg> <!-- already in findbugs -->
+                <arg>-Xep:ClassNewInstance:ERROR</arg>
               </compilerArgs>
               <annotationProcessorPaths>
                 <path>

http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java
----------------------------------------------------------------------
diff --git a/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java b/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java
index 6beb3f6..c8badd3 100644
--- a/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java
+++ b/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java
@@ -27,6 +27,7 @@ import com.google.protobuf.RpcController;
 import com.google.protobuf.Service;
 
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -480,21 +481,19 @@ extends AggregateService implements RegionCoprocessor {
   ColumnInterpreter<T,S,P,Q,R> constructColumnInterpreterFromRequest(
       AggregateRequest request) throws IOException {
     String className = request.getInterpreterClassName();
-    Class<?> cls;
     try {
-      cls = Class.forName(className);
-      ColumnInterpreter<T,S,P,Q,R> ci = (ColumnInterpreter<T, S, P, Q, R>) cls.newInstance();
+      ColumnInterpreter<T,S,P,Q,R> ci;
+      Class<?> cls = Class.forName(className);
+      ci = (ColumnInterpreter<T, S, P, Q, R>) cls.getDeclaredConstructor().newInstance();
+
       if (request.hasInterpreterSpecificBytes()) {
         ByteString b = request.getInterpreterSpecificBytes();
         P initMsg = getParsedGenericInstance(ci.getClass(), 2, b);
         ci.initialize(initMsg);
       }
       return ci;
-    } catch (ClassNotFoundException e) {
-      throw new IOException(e);
-    } catch (InstantiationException e) {
-      throw new IOException(e);
-    } catch (IllegalAccessException e) {
+    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException |
+        NoSuchMethodException | InvocationTargetException e) {
       throw new IOException(e);
     }
   }

http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java
----------------------------------------------------------------------
diff --git a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java
index 626deff..5cd87ae 100644
--- a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java
+++ b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java
@@ -281,7 +281,8 @@ public class MultithreadedTableMapper<K2, V2> extends TableMapper<K2, V2> {
             outer.getInputSplit());
           Class<?> wrappedMapperClass = Class.forName("org.apache.hadoop.mapreduce.lib.map.WrappedMapper");
           Method getMapContext = wrappedMapperClass.getMethod("getMapContext", MapContext.class);
-          subcontext = (Context) getMapContext.invoke(wrappedMapperClass.newInstance(), mc);
+          subcontext = (Context) getMapContext.invoke(
+              wrappedMapperClass.getDeclaredConstructor().newInstance(), mc);
         } catch (Exception ee) { // FindBugs: REC_CATCH_EXCEPTION
           // rethrow as IOE
           throw new IOException(e);

http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
----------------------------------------------------------------------
diff --git a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
index add0985f..1795ce1 100644
--- a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
+++ b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
@@ -22,6 +22,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
@@ -300,17 +301,11 @@ public class TableSnapshotInputFormatImpl {
     if (splitAlgoClassName == null)
       return null;
     try {
-      return ((Class<? extends RegionSplitter.SplitAlgorithm>)
-              Class.forName(splitAlgoClassName)).newInstance();
-    } catch (ClassNotFoundException e) {
-      throw new IOException("SplitAlgo class " + splitAlgoClassName +
-              " is not found", e);
-    } catch (InstantiationException e) {
-      throw new IOException("SplitAlgo class " + splitAlgoClassName +
-              " is not instantiable", e);
-    } catch (IllegalAccessException e) {
-      throw new IOException("SplitAlgo class " + splitAlgoClassName +
-              " is not instantiable", e);
+      return Class.forName(splitAlgoClassName).asSubclass(RegionSplitter.SplitAlgorithm.class)
+          .getDeclaredConstructor().newInstance();
+    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException |
+        NoSuchMethodException | InvocationTargetException e) {
+      throw new IOException("SplitAlgo class " + splitAlgoClassName + " is not found", e);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java
index 426e516..759d252 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java
@@ -21,6 +21,7 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -593,14 +594,11 @@ public final class Constraints {
           // add the constraint, now that we expect it to be valid.
           Class<? extends Constraint> clazz = classloader.loadClass(key)
               .asSubclass(Constraint.class);
-          Constraint constraint = clazz.newInstance();
+          Constraint constraint = clazz.getDeclaredConstructor().newInstance();
           constraint.setConf(conf);
           constraints.add(constraint);
-        } catch (ClassNotFoundException e1) {
-          throw new IOException(e1);
-        } catch (InstantiationException e1) {
-          throw new IOException(e1);
-        } catch (IllegalAccessException e1) {
+        } catch (InvocationTargetException | NoSuchMethodException | ClassNotFoundException |
+            InstantiationException | IllegalAccessException e1) {
           throw new IOException(e1);
         }
       }

http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
index 7f17227..8c8c02c 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
@@ -20,6 +20,7 @@ package org.apache.hadoop.hbase.master;
 
 import com.google.protobuf.Service;
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.util.List;
 import java.util.Set;
 import org.apache.hadoop.conf.Configuration;
@@ -170,17 +171,22 @@ public class MasterCoprocessorHost
   @Override
   public MasterCoprocessor checkAndGetInstance(Class<?> implClass)
       throws InstantiationException, IllegalAccessException {
-    if (MasterCoprocessor.class.isAssignableFrom(implClass)) {
-      return (MasterCoprocessor)implClass.newInstance();
-    } else if (CoprocessorService.class.isAssignableFrom(implClass)) {
-      // For backward compatibility with old CoprocessorService impl which don't extend
-      // MasterCoprocessor.
-      return new CoprocessorServiceBackwardCompatiblity.MasterCoprocessorService(
-          (CoprocessorService)implClass.newInstance());
-    } else {
-      LOG.error(implClass.getName() + " is not of type MasterCoprocessor. Check the "
-          + "configuration " + CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY);
-      return null;
+    try {
+      if (MasterCoprocessor.class.isAssignableFrom(implClass)) {
+        return implClass.asSubclass(MasterCoprocessor.class).getDeclaredConstructor().newInstance();
+      } else if (CoprocessorService.class.isAssignableFrom(implClass)) {
+        // For backward compatibility with old CoprocessorService impl which don't extend
+        // MasterCoprocessor.
+        CoprocessorService cs;
+        cs = implClass.asSubclass(CoprocessorService.class).getDeclaredConstructor().newInstance();
+        return new CoprocessorServiceBackwardCompatiblity.MasterCoprocessorService(cs);
+      } else {
+        LOG.error("{} is not of type MasterCoprocessor. Check the configuration of {}",
+            implClass.getName(), CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY);
+        return null;
+      }
+    } catch (NoSuchMethodException | InvocationTargetException e) {
+      throw (InstantiationException) new InstantiationException(implClass.getName()).initCause(e);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.java
index 7620638..1e93373 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.java
@@ -310,10 +310,10 @@ public class ReplicationPeerManager {
       String[] filters = filterCSV.split(",");
       for (String filter : filters) {
         try {
-          Class.forName(filter).newInstance();
+          Class.forName(filter).getDeclaredConstructor().newInstance();
         } catch (Exception e) {
           throw new DoNotRetryIOException("Configured WALEntryFilter " + filter +
-            " could not be created. Failing add/update " + "peer operation.", e);
+            " could not be created. Failing add/update peer operation.", e);
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
index 3efea4e..c559823 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
@@ -20,6 +20,7 @@ package org.apache.hadoop.hbase.regionserver;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InterruptedIOException;
+import java.lang.reflect.InvocationTargetException;
 import java.net.BindException;
 import java.net.InetSocketAddress;
 import java.net.UnknownHostException;
@@ -1185,11 +1186,13 @@ public class RSRpcServices implements HBaseRPCErrorHandler,
     rowSizeWarnThreshold = rs.conf.getInt(BATCH_ROWS_THRESHOLD_NAME, BATCH_ROWS_THRESHOLD_DEFAULT);
     RpcSchedulerFactory rpcSchedulerFactory;
     try {
-      Class<?> rpcSchedulerFactoryClass = rs.conf.getClass(
+      Class<?> cls = rs.conf.getClass(
           REGION_SERVER_RPC_SCHEDULER_FACTORY_CLASS,
           SimpleRpcSchedulerFactory.class);
-      rpcSchedulerFactory = ((RpcSchedulerFactory) rpcSchedulerFactoryClass.newInstance());
-    } catch (InstantiationException | IllegalAccessException e) {
+      rpcSchedulerFactory = cls.asSubclass(RpcSchedulerFactory.class)
+          .getDeclaredConstructor().newInstance();
+    } catch (NoSuchMethodException | InvocationTargetException |
+        InstantiationException | IllegalAccessException e) {
       throw new IllegalArgumentException(e);
     }
     // Server to handle client requests.
@@ -3549,8 +3552,8 @@ public class RSRpcServices implements HBaseRPCErrorHandler,
         for (RemoteProcedureRequest req : request.getProcList()) {
           RSProcedureCallable callable;
           try {
-            callable =
-              Class.forName(req.getProcClass()).asSubclass(RSProcedureCallable.class).newInstance();
+            callable = Class.forName(req.getProcClass()).asSubclass(RSProcedureCallable.class)
+              .getDeclaredConstructor().newInstance();
           } catch (Exception e) {
             regionServer.remoteProcedureComplete(req.getProcId(), e);
             continue;

http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
index 47b389a..b35f4fb 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
@@ -22,6 +22,7 @@ import com.google.protobuf.Message;
 import com.google.protobuf.Service;
 
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -465,17 +466,22 @@ public class RegionCoprocessorHost
   @Override
   public RegionCoprocessor checkAndGetInstance(Class<?> implClass)
       throws InstantiationException, IllegalAccessException {
-    if (RegionCoprocessor.class.isAssignableFrom(implClass)) {
-      return (RegionCoprocessor)implClass.newInstance();
-    } else if (CoprocessorService.class.isAssignableFrom(implClass)) {
-      // For backward compatibility with old CoprocessorService impl which don't extend
-      // RegionCoprocessor.
-      return new CoprocessorServiceBackwardCompatiblity.RegionCoprocessorService(
-          (CoprocessorService)implClass.newInstance());
-    } else {
-      LOG.error(implClass.getName() + " is not of type RegionCoprocessor. Check the "
-          + "configuration " + CoprocessorHost.REGION_COPROCESSOR_CONF_KEY);
-      return null;
+    try {
+      if (RegionCoprocessor.class.isAssignableFrom(implClass)) {
+        return implClass.asSubclass(RegionCoprocessor.class).getDeclaredConstructor().newInstance();
+      } else if (CoprocessorService.class.isAssignableFrom(implClass)) {
+        // For backward compatibility with old CoprocessorService impl which don't extend
+        // RegionCoprocessor.
+        CoprocessorService cs;
+        cs = implClass.asSubclass(CoprocessorService.class).getDeclaredConstructor().newInstance();
+        return new CoprocessorServiceBackwardCompatiblity.RegionCoprocessorService(cs);
+      } else {
+        LOG.error("{} is not of type RegionCoprocessor. Check the configuration of {}",
+            implClass.getName(), CoprocessorHost.REGION_COPROCESSOR_CONF_KEY);
+        return null;
+      }
+    } catch (NoSuchMethodException | InvocationTargetException e) {
+      throw (InstantiationException) new InstantiationException(implClass.getName()).initCause(e);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java
index f4122ce..42a4e00 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java
@@ -19,6 +19,7 @@
 package org.apache.hadoop.hbase.regionserver;
 
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 
 import com.google.protobuf.Service;
 
@@ -82,17 +83,23 @@ public class RegionServerCoprocessorHost extends
   @Override
   public RegionServerCoprocessor checkAndGetInstance(Class<?> implClass)
       throws InstantiationException, IllegalAccessException {
-    if (RegionServerCoprocessor.class.isAssignableFrom(implClass)) {
-      return (RegionServerCoprocessor)implClass.newInstance();
-    } else if (SingletonCoprocessorService.class.isAssignableFrom(implClass)) {
-      // For backward compatibility with old CoprocessorService impl which don't extend
-      // RegionCoprocessor.
-      return new CoprocessorServiceBackwardCompatiblity.RegionServerCoprocessorService(
-          (SingletonCoprocessorService)implClass.newInstance());
-    } else {
-      LOG.error(implClass.getName() + " is not of type RegionServerCoprocessor. Check the "
-          + "configuration " + CoprocessorHost.REGIONSERVER_COPROCESSOR_CONF_KEY);
-      return null;
+    try {
+      if (RegionServerCoprocessor.class.isAssignableFrom(implClass)) {
+        return implClass.asSubclass(RegionServerCoprocessor.class).getDeclaredConstructor()
+            .newInstance();
+      } else if (SingletonCoprocessorService.class.isAssignableFrom(implClass)) {
+        // For backward compatibility with old CoprocessorService impl which don't extend
+        // RegionCoprocessor.
+        SingletonCoprocessorService tmp = implClass.asSubclass(SingletonCoprocessorService.class)
+            .getDeclaredConstructor().newInstance();
+        return new CoprocessorServiceBackwardCompatiblity.RegionServerCoprocessorService(tmp);
+      } else {
+        LOG.error("{} is not of type RegionServerCoprocessor. Check the configuration of {}",
+            implClass.getName(), CoprocessorHost.REGIONSERVER_COPROCESSOR_CONF_KEY);
+        return null;
+      }
+    } catch (NoSuchMethodException | InvocationTargetException e) {
+      throw (InstantiationException) new InstantiationException(implClass.getName()).initCause(e);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java
index 7b6182e..40d6d0f 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java
@@ -21,6 +21,7 @@
 package org.apache.hadoop.hbase.regionserver.wal;
 
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.Path;
@@ -118,10 +119,14 @@ public class WALCoprocessorHost
   }
 
   @Override
-  public WALCoprocessor checkAndGetInstance(Class<?> implClass)
-      throws InstantiationException, IllegalAccessException {
+  public WALCoprocessor checkAndGetInstance(Class<?> implClass) throws IllegalAccessException,
+      InstantiationException {
     if (WALCoprocessor.class.isAssignableFrom(implClass)) {
-      return (WALCoprocessor)implClass.newInstance();
+      try {
+        return implClass.asSubclass(WALCoprocessor.class).getDeclaredConstructor().newInstance();
+      } catch (NoSuchMethodException | InvocationTargetException e) {
+        throw (InstantiationException) new InstantiationException(implClass.getName()).initCause(e);
+      }
     } else {
       LOG.error(implClass.getName() + " is not of type WALCoprocessor. Check the "
           + "configuration " + CoprocessorHost.WAL_COPROCESSOR_CONF_KEY);

http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSource.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSource.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSource.java
index 80d08ef..3480919 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSource.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSource.java
@@ -18,6 +18,7 @@
 package org.apache.hadoop.hbase.replication.regionserver;
 
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Comparator;
@@ -242,12 +243,21 @@ public class ReplicationSource implements ReplicationSourceInterface {
       rsServerHost = ((HRegionServer) server).getRegionServerCoprocessorHost();
     }
     String replicationEndpointImpl = replicationPeer.getPeerConfig().getReplicationEndpointImpl();
+
+    ReplicationEndpoint replicationEndpoint;
     if (replicationEndpointImpl == null) {
-      // Default to HBase inter-cluster replication endpoint
-      replicationEndpointImpl = HBaseInterClusterReplicationEndpoint.class.getName();
+      // Default to HBase inter-cluster replication endpoint; skip reflection
+      replicationEndpoint = new HBaseInterClusterReplicationEndpoint();
+    } else {
+      try {
+        replicationEndpoint = Class.forName(replicationEndpointImpl)
+            .asSubclass(ReplicationEndpoint.class)
+            .getDeclaredConstructor()
+            .newInstance();
+      } catch (NoSuchMethodException | InvocationTargetException e) {
+        throw new IllegalArgumentException(e);
+      }
     }
-    ReplicationEndpoint replicationEndpoint =
-      Class.forName(replicationEndpointImpl).asSubclass(ReplicationEndpoint.class).newInstance();
     if (rsServerHost != null) {
       ReplicationEndpoint newReplicationEndPoint =
         rsServerHost.postCreateReplicationEndPoint(replicationEndpoint);

http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java
index 93e8331..d613049 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java
@@ -40,10 +40,9 @@ public class ReplicationSourceFactory {
       String defaultReplicationSourceImpl =
           isQueueRecovered ? RecoveredReplicationSource.class.getCanonicalName()
               : ReplicationSource.class.getCanonicalName();
-      @SuppressWarnings("rawtypes")
-      Class c = Class.forName(
+      Class<?> c = Class.forName(
         conf.get("replication.replicationsource.implementation", defaultReplicationSourceImpl));
-      src = (ReplicationSourceInterface) c.newInstance();
+      src = c.asSubclass(ReplicationSourceInterface.class).getDeclaredConstructor().newInstance();
     } catch (Exception e) {
       LOG.warn("Passed replication source implementation throws errors, "
           + "defaulting to ReplicationSource",

http://git-wip-us.apache.org/repos/asf/hbase/blob/f63a7ff6/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.java
index c541647..3cf2221 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.java
@@ -20,6 +20,8 @@ package org.apache.hadoop.hbase.coprocessor;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
+import java.lang.reflect.InvocationTargetException;
+
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.Abortable;
 import org.apache.hadoop.hbase.Coprocessor;
@@ -56,47 +58,61 @@ public class TestCoprocessorHost {
       return this.aborted;
     }
   }
+
   @Test
   public void testDoubleLoadingAndPriorityValue() {
     final Configuration conf = HBaseConfiguration.create();
-    CoprocessorHost<RegionCoprocessor, CoprocessorEnvironment<RegionCoprocessor>> host =
-        new CoprocessorHost<RegionCoprocessor, CoprocessorEnvironment<RegionCoprocessor>>(
-            new TestAbortable()) {
-          @Override
-          public RegionCoprocessor checkAndGetInstance(Class<?> implClass)
-              throws InstantiationException, IllegalAccessException {
-            if(RegionCoprocessor.class.isAssignableFrom(implClass)) {
-              return (RegionCoprocessor)implClass.newInstance();
-            }
-            return null;
-          }
-
-          final Configuration cpHostConf = conf;
-
-      @Override
-      public CoprocessorEnvironment<RegionCoprocessor> createEnvironment(
-          final RegionCoprocessor instance, final int priority, int sequence, Configuration conf) {
-        return new BaseEnvironment<RegionCoprocessor>(instance, priority, 0, cpHostConf);
-      }
-    };
     final String key = "KEY";
     final String coprocessor = "org.apache.hadoop.hbase.coprocessor.SimpleRegionObserver";
+
+    CoprocessorHost<RegionCoprocessor, CoprocessorEnvironment<RegionCoprocessor>> host;
+    host = new CoprocessorHostForTest<>(conf);
+
     // Try and load a coprocessor three times
     conf.setStrings(key, coprocessor, coprocessor, coprocessor,
         SimpleRegionObserverV2.class.getName());
     host.loadSystemCoprocessors(conf, key);
+
     // Two coprocessors(SimpleRegionObserver and SimpleRegionObserverV2) loaded
     Assert.assertEquals(2, host.coprocEnvironments.size());
+
     // Check the priority value
-    CoprocessorEnvironment simpleEnv = host.findCoprocessorEnvironment(
+    CoprocessorEnvironment<?> simpleEnv = host.findCoprocessorEnvironment(
         SimpleRegionObserver.class.getName());
-    CoprocessorEnvironment simpleEnv_v2 = host.findCoprocessorEnvironment(
+    CoprocessorEnvironment<?> simpleEnv_v2 = host.findCoprocessorEnvironment(
         SimpleRegionObserverV2.class.getName());
+
     assertNotNull(simpleEnv);
     assertNotNull(simpleEnv_v2);
     assertEquals(Coprocessor.PRIORITY_SYSTEM, simpleEnv.getPriority());
     assertEquals(Coprocessor.PRIORITY_SYSTEM + 1, simpleEnv_v2.getPriority());
   }
-  public static class SimpleRegionObserverV2 extends SimpleRegionObserver {
+
+  public static class SimpleRegionObserverV2 extends SimpleRegionObserver { }
+
+  private static class CoprocessorHostForTest<E extends Coprocessor> extends
+      CoprocessorHost<E, CoprocessorEnvironment<E>> {
+    final Configuration cpHostConf;
+
+    public CoprocessorHostForTest(Configuration conf) {
+      super(new TestAbortable());
+      cpHostConf = conf;
+    }
+
+    @Override
+    public E checkAndGetInstance(Class<?> implClass)
+        throws InstantiationException, IllegalAccessException {
+      try {
+        return (E) implClass.getDeclaredConstructor().newInstance();
+      } catch (InvocationTargetException | NoSuchMethodException e) {
+        throw (InstantiationException) new InstantiationException().initCause(e);
+      }
+    }
+
+    @Override
+    public CoprocessorEnvironment<E> createEnvironment(final E instance, final int priority,
+        int sequence, Configuration conf) {
+      return new BaseEnvironment<>(instance, priority, 0, cpHostConf);
+    }
   }
 }


[2/3] hbase git commit: HBASE-20180 Avoid Class::newInstance

Posted by md...@apache.org.
HBASE-20180 Avoid Class::newInstance


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/1cb2f83e
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/1cb2f83e
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/1cb2f83e

Branch: refs/heads/branch-2.0
Commit: 1cb2f83eeffd7be3a93c45cc06b6ef7fd7fc131b
Parents: bceacf3
Author: Mike Drob <md...@apache.org>
Authored: Mon Mar 12 16:05:39 2018 -0500
Committer: Mike Drob <md...@apache.org>
Committed: Wed Mar 14 13:14:52 2018 -0500

----------------------------------------------------------------------
 hbase-build-configuration/pom.xml               |  1 +
 .../coprocessor/AggregateImplementation.java    | 15 +++--
 .../mapreduce/MultithreadedTableMapper.java     |  3 +-
 .../mapreduce/TableSnapshotInputFormatImpl.java | 17 ++----
 .../hadoop/hbase/constraint/Constraints.java    | 10 ++--
 .../hbase/master/MasterCoprocessorHost.java     | 28 +++++----
 .../master/replication/ReplicationManager.java  |  2 +-
 .../hbase/regionserver/RSRpcServices.java       |  9 ++-
 .../regionserver/RegionCoprocessorHost.java     | 28 +++++----
 .../RegionServerCoprocessorHost.java            | 29 +++++----
 .../regionserver/wal/WALCoprocessorHost.java    | 11 +++-
 .../regionserver/ReplicationSourceFactory.java  |  5 +-
 .../regionserver/ReplicationSourceManager.java  |  5 +-
 .../hbase/coprocessor/TestCoprocessorHost.java  | 62 ++++++++++++--------
 14 files changed, 130 insertions(+), 95 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/1cb2f83e/hbase-build-configuration/pom.xml
----------------------------------------------------------------------
diff --git a/hbase-build-configuration/pom.xml b/hbase-build-configuration/pom.xml
index 55de725..4f352f9 100644
--- a/hbase-build-configuration/pom.xml
+++ b/hbase-build-configuration/pom.xml
@@ -83,6 +83,7 @@
               <compilerArgs>
                 <arg>-XepDisableWarningsInGeneratedCode</arg>
                 <arg>-Xep:FallThrough:OFF</arg> <!-- already in findbugs -->
+                <arg>-Xep:ClassNewInstance:ERROR</arg>
               </compilerArgs>
               <annotationProcessorPaths>
                 <path>

http://git-wip-us.apache.org/repos/asf/hbase/blob/1cb2f83e/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java
----------------------------------------------------------------------
diff --git a/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java b/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java
index 6beb3f6..c8badd3 100644
--- a/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java
+++ b/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java
@@ -27,6 +27,7 @@ import com.google.protobuf.RpcController;
 import com.google.protobuf.Service;
 
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -480,21 +481,19 @@ extends AggregateService implements RegionCoprocessor {
   ColumnInterpreter<T,S,P,Q,R> constructColumnInterpreterFromRequest(
       AggregateRequest request) throws IOException {
     String className = request.getInterpreterClassName();
-    Class<?> cls;
     try {
-      cls = Class.forName(className);
-      ColumnInterpreter<T,S,P,Q,R> ci = (ColumnInterpreter<T, S, P, Q, R>) cls.newInstance();
+      ColumnInterpreter<T,S,P,Q,R> ci;
+      Class<?> cls = Class.forName(className);
+      ci = (ColumnInterpreter<T, S, P, Q, R>) cls.getDeclaredConstructor().newInstance();
+
       if (request.hasInterpreterSpecificBytes()) {
         ByteString b = request.getInterpreterSpecificBytes();
         P initMsg = getParsedGenericInstance(ci.getClass(), 2, b);
         ci.initialize(initMsg);
       }
       return ci;
-    } catch (ClassNotFoundException e) {
-      throw new IOException(e);
-    } catch (InstantiationException e) {
-      throw new IOException(e);
-    } catch (IllegalAccessException e) {
+    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException |
+        NoSuchMethodException | InvocationTargetException e) {
       throw new IOException(e);
     }
   }

http://git-wip-us.apache.org/repos/asf/hbase/blob/1cb2f83e/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java
----------------------------------------------------------------------
diff --git a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java
index 626deff..5cd87ae 100644
--- a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java
+++ b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java
@@ -281,7 +281,8 @@ public class MultithreadedTableMapper<K2, V2> extends TableMapper<K2, V2> {
             outer.getInputSplit());
           Class<?> wrappedMapperClass = Class.forName("org.apache.hadoop.mapreduce.lib.map.WrappedMapper");
           Method getMapContext = wrappedMapperClass.getMethod("getMapContext", MapContext.class);
-          subcontext = (Context) getMapContext.invoke(wrappedMapperClass.newInstance(), mc);
+          subcontext = (Context) getMapContext.invoke(
+              wrappedMapperClass.getDeclaredConstructor().newInstance(), mc);
         } catch (Exception ee) { // FindBugs: REC_CATCH_EXCEPTION
           // rethrow as IOE
           throw new IOException(e);

http://git-wip-us.apache.org/repos/asf/hbase/blob/1cb2f83e/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
----------------------------------------------------------------------
diff --git a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
index add0985f..1795ce1 100644
--- a/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
+++ b/hbase-mapreduce/src/main/java/org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java
@@ -22,6 +22,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
@@ -300,17 +301,11 @@ public class TableSnapshotInputFormatImpl {
     if (splitAlgoClassName == null)
       return null;
     try {
-      return ((Class<? extends RegionSplitter.SplitAlgorithm>)
-              Class.forName(splitAlgoClassName)).newInstance();
-    } catch (ClassNotFoundException e) {
-      throw new IOException("SplitAlgo class " + splitAlgoClassName +
-              " is not found", e);
-    } catch (InstantiationException e) {
-      throw new IOException("SplitAlgo class " + splitAlgoClassName +
-              " is not instantiable", e);
-    } catch (IllegalAccessException e) {
-      throw new IOException("SplitAlgo class " + splitAlgoClassName +
-              " is not instantiable", e);
+      return Class.forName(splitAlgoClassName).asSubclass(RegionSplitter.SplitAlgorithm.class)
+          .getDeclaredConstructor().newInstance();
+    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException |
+        NoSuchMethodException | InvocationTargetException e) {
+      throw new IOException("SplitAlgo class " + splitAlgoClassName + " is not found", e);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/1cb2f83e/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java
index 426e516..759d252 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java
@@ -21,6 +21,7 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -593,14 +594,11 @@ public final class Constraints {
           // add the constraint, now that we expect it to be valid.
           Class<? extends Constraint> clazz = classloader.loadClass(key)
               .asSubclass(Constraint.class);
-          Constraint constraint = clazz.newInstance();
+          Constraint constraint = clazz.getDeclaredConstructor().newInstance();
           constraint.setConf(conf);
           constraints.add(constraint);
-        } catch (ClassNotFoundException e1) {
-          throw new IOException(e1);
-        } catch (InstantiationException e1) {
-          throw new IOException(e1);
-        } catch (IllegalAccessException e1) {
+        } catch (InvocationTargetException | NoSuchMethodException | ClassNotFoundException |
+            InstantiationException | IllegalAccessException e1) {
           throw new IOException(e1);
         }
       }

http://git-wip-us.apache.org/repos/asf/hbase/blob/1cb2f83e/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
index 7f17227..8c8c02c 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
@@ -20,6 +20,7 @@ package org.apache.hadoop.hbase.master;
 
 import com.google.protobuf.Service;
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.util.List;
 import java.util.Set;
 import org.apache.hadoop.conf.Configuration;
@@ -170,17 +171,22 @@ public class MasterCoprocessorHost
   @Override
   public MasterCoprocessor checkAndGetInstance(Class<?> implClass)
       throws InstantiationException, IllegalAccessException {
-    if (MasterCoprocessor.class.isAssignableFrom(implClass)) {
-      return (MasterCoprocessor)implClass.newInstance();
-    } else if (CoprocessorService.class.isAssignableFrom(implClass)) {
-      // For backward compatibility with old CoprocessorService impl which don't extend
-      // MasterCoprocessor.
-      return new CoprocessorServiceBackwardCompatiblity.MasterCoprocessorService(
-          (CoprocessorService)implClass.newInstance());
-    } else {
-      LOG.error(implClass.getName() + " is not of type MasterCoprocessor. Check the "
-          + "configuration " + CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY);
-      return null;
+    try {
+      if (MasterCoprocessor.class.isAssignableFrom(implClass)) {
+        return implClass.asSubclass(MasterCoprocessor.class).getDeclaredConstructor().newInstance();
+      } else if (CoprocessorService.class.isAssignableFrom(implClass)) {
+        // For backward compatibility with old CoprocessorService impl which don't extend
+        // MasterCoprocessor.
+        CoprocessorService cs;
+        cs = implClass.asSubclass(CoprocessorService.class).getDeclaredConstructor().newInstance();
+        return new CoprocessorServiceBackwardCompatiblity.MasterCoprocessorService(cs);
+      } else {
+        LOG.error("{} is not of type MasterCoprocessor. Check the configuration of {}",
+            implClass.getName(), CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY);
+        return null;
+      }
+    } catch (NoSuchMethodException | InvocationTargetException e) {
+      throw (InstantiationException) new InstantiationException(implClass.getName()).initCause(e);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/1cb2f83e/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationManager.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationManager.java
index f36b2e2..9f0057a 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationManager.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/replication/ReplicationManager.java
@@ -192,7 +192,7 @@ public class ReplicationManager {
       for (String filter : filters) {
         try {
           Class clazz = Class.forName(filter);
-          Object o = clazz.newInstance();
+          Object o = clazz.getDeclaredConstructor().newInstance();
         } catch (Exception e) {
           throw new DoNotRetryIOException("Configured WALEntryFilter " + filter +
               " could not be created. Failing add/update " + "peer operation.", e);

http://git-wip-us.apache.org/repos/asf/hbase/blob/1cb2f83e/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
index 072aee3..2e917d1 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
@@ -21,6 +21,7 @@ package org.apache.hadoop.hbase.regionserver;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InterruptedIOException;
+import java.lang.reflect.InvocationTargetException;
 import java.net.BindException;
 import java.net.InetSocketAddress;
 import java.net.UnknownHostException;
@@ -1178,11 +1179,13 @@ public class RSRpcServices implements HBaseRPCErrorHandler,
     rowSizeWarnThreshold = rs.conf.getInt(BATCH_ROWS_THRESHOLD_NAME, BATCH_ROWS_THRESHOLD_DEFAULT);
     RpcSchedulerFactory rpcSchedulerFactory;
     try {
-      Class<?> rpcSchedulerFactoryClass = rs.conf.getClass(
+      Class<?> cls = rs.conf.getClass(
           REGION_SERVER_RPC_SCHEDULER_FACTORY_CLASS,
           SimpleRpcSchedulerFactory.class);
-      rpcSchedulerFactory = ((RpcSchedulerFactory) rpcSchedulerFactoryClass.newInstance());
-    } catch (InstantiationException | IllegalAccessException e) {
+      rpcSchedulerFactory = cls.asSubclass(RpcSchedulerFactory.class)
+          .getDeclaredConstructor().newInstance();
+    } catch (NoSuchMethodException | InvocationTargetException |
+        InstantiationException | IllegalAccessException e) {
       throw new IllegalArgumentException(e);
     }
     // Server to handle client requests.

http://git-wip-us.apache.org/repos/asf/hbase/blob/1cb2f83e/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
index 47b389a..b35f4fb 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
@@ -22,6 +22,7 @@ import com.google.protobuf.Message;
 import com.google.protobuf.Service;
 
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -465,17 +466,22 @@ public class RegionCoprocessorHost
   @Override
   public RegionCoprocessor checkAndGetInstance(Class<?> implClass)
       throws InstantiationException, IllegalAccessException {
-    if (RegionCoprocessor.class.isAssignableFrom(implClass)) {
-      return (RegionCoprocessor)implClass.newInstance();
-    } else if (CoprocessorService.class.isAssignableFrom(implClass)) {
-      // For backward compatibility with old CoprocessorService impl which don't extend
-      // RegionCoprocessor.
-      return new CoprocessorServiceBackwardCompatiblity.RegionCoprocessorService(
-          (CoprocessorService)implClass.newInstance());
-    } else {
-      LOG.error(implClass.getName() + " is not of type RegionCoprocessor. Check the "
-          + "configuration " + CoprocessorHost.REGION_COPROCESSOR_CONF_KEY);
-      return null;
+    try {
+      if (RegionCoprocessor.class.isAssignableFrom(implClass)) {
+        return implClass.asSubclass(RegionCoprocessor.class).getDeclaredConstructor().newInstance();
+      } else if (CoprocessorService.class.isAssignableFrom(implClass)) {
+        // For backward compatibility with old CoprocessorService impl which don't extend
+        // RegionCoprocessor.
+        CoprocessorService cs;
+        cs = implClass.asSubclass(CoprocessorService.class).getDeclaredConstructor().newInstance();
+        return new CoprocessorServiceBackwardCompatiblity.RegionCoprocessorService(cs);
+      } else {
+        LOG.error("{} is not of type RegionCoprocessor. Check the configuration of {}",
+            implClass.getName(), CoprocessorHost.REGION_COPROCESSOR_CONF_KEY);
+        return null;
+      }
+    } catch (NoSuchMethodException | InvocationTargetException e) {
+      throw (InstantiationException) new InstantiationException(implClass.getName()).initCause(e);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/1cb2f83e/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java
index 1986668..6770fe5 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java
@@ -19,6 +19,7 @@
 package org.apache.hadoop.hbase.regionserver;
 
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 
 import com.google.protobuf.Service;
 
@@ -82,17 +83,23 @@ public class RegionServerCoprocessorHost extends
   @Override
   public RegionServerCoprocessor checkAndGetInstance(Class<?> implClass)
       throws InstantiationException, IllegalAccessException {
-    if (RegionServerCoprocessor.class.isAssignableFrom(implClass)) {
-      return (RegionServerCoprocessor)implClass.newInstance();
-    } else if (SingletonCoprocessorService.class.isAssignableFrom(implClass)) {
-      // For backward compatibility with old CoprocessorService impl which don't extend
-      // RegionCoprocessor.
-      return new CoprocessorServiceBackwardCompatiblity.RegionServerCoprocessorService(
-          (SingletonCoprocessorService)implClass.newInstance());
-    } else {
-      LOG.error(implClass.getName() + " is not of type RegionServerCoprocessor. Check the "
-          + "configuration " + CoprocessorHost.REGIONSERVER_COPROCESSOR_CONF_KEY);
-      return null;
+    try {
+      if (RegionServerCoprocessor.class.isAssignableFrom(implClass)) {
+        return implClass.asSubclass(RegionServerCoprocessor.class).getDeclaredConstructor()
+            .newInstance();
+      } else if (SingletonCoprocessorService.class.isAssignableFrom(implClass)) {
+        // For backward compatibility with old CoprocessorService impl which don't extend
+        // RegionCoprocessor.
+        SingletonCoprocessorService tmp = implClass.asSubclass(SingletonCoprocessorService.class)
+            .getDeclaredConstructor().newInstance();
+        return new CoprocessorServiceBackwardCompatiblity.RegionServerCoprocessorService(tmp);
+      } else {
+        LOG.error("{} is not of type RegionServerCoprocessor. Check the configuration of {}",
+            implClass.getName(), CoprocessorHost.REGIONSERVER_COPROCESSOR_CONF_KEY);
+        return null;
+      }
+    } catch (NoSuchMethodException | InvocationTargetException e) {
+      throw (InstantiationException) new InstantiationException(implClass.getName()).initCause(e);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/1cb2f83e/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java
index 7b6182e..40d6d0f 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java
@@ -21,6 +21,7 @@
 package org.apache.hadoop.hbase.regionserver.wal;
 
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.Path;
@@ -118,10 +119,14 @@ public class WALCoprocessorHost
   }
 
   @Override
-  public WALCoprocessor checkAndGetInstance(Class<?> implClass)
-      throws InstantiationException, IllegalAccessException {
+  public WALCoprocessor checkAndGetInstance(Class<?> implClass) throws IllegalAccessException,
+      InstantiationException {
     if (WALCoprocessor.class.isAssignableFrom(implClass)) {
-      return (WALCoprocessor)implClass.newInstance();
+      try {
+        return implClass.asSubclass(WALCoprocessor.class).getDeclaredConstructor().newInstance();
+      } catch (NoSuchMethodException | InvocationTargetException e) {
+        throw (InstantiationException) new InstantiationException(implClass.getName()).initCause(e);
+      }
     } else {
       LOG.error(implClass.getName() + " is not of type WALCoprocessor. Check the "
           + "configuration " + CoprocessorHost.WAL_COPROCESSOR_CONF_KEY);

http://git-wip-us.apache.org/repos/asf/hbase/blob/1cb2f83e/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java
index 865a202..cf7527e 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java
@@ -40,10 +40,9 @@ public class ReplicationSourceFactory {
       String defaultReplicationSourceImpl =
           isQueueRecovered ? RecoveredReplicationSource.class.getCanonicalName()
               : ReplicationSource.class.getCanonicalName();
-      @SuppressWarnings("rawtypes")
-      Class c = Class.forName(
+      Class<?> c = Class.forName(
         conf.get("replication.replicationsource.implementation", defaultReplicationSourceImpl));
-      src = (ReplicationSourceInterface) c.newInstance();
+      src = c.asSubclass(ReplicationSourceInterface.class).getDeclaredConstructor().newInstance();
     } catch (Exception e) {
       LOG.warn("Passed replication source implementation throws errors, "
           + "defaulting to ReplicationSource",

http://git-wip-us.apache.org/repos/asf/hbase/blob/1cb2f83e/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceManager.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceManager.java
index bfd338d..b54d9b7 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceManager.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceManager.java
@@ -484,9 +484,8 @@ public class ReplicationSourceManager implements ReplicationListener {
         // Default to HBase inter-cluster replication endpoint
         replicationEndpointImpl = HBaseInterClusterReplicationEndpoint.class.getName();
       }
-      @SuppressWarnings("rawtypes")
-      Class c = Class.forName(replicationEndpointImpl);
-      replicationEndpoint = (ReplicationEndpoint) c.newInstance();
+      Class<?> c = Class.forName(replicationEndpointImpl);
+      replicationEndpoint = (ReplicationEndpoint) c.getDeclaredConstructor().newInstance();
       if(rsServerHost != null) {
         ReplicationEndpoint newReplicationEndPoint = rsServerHost
             .postCreateReplicationEndPoint(replicationEndpoint);

http://git-wip-us.apache.org/repos/asf/hbase/blob/1cb2f83e/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.java
index c541647..3cf2221 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.java
@@ -20,6 +20,8 @@ package org.apache.hadoop.hbase.coprocessor;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
+import java.lang.reflect.InvocationTargetException;
+
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.Abortable;
 import org.apache.hadoop.hbase.Coprocessor;
@@ -56,47 +58,61 @@ public class TestCoprocessorHost {
       return this.aborted;
     }
   }
+
   @Test
   public void testDoubleLoadingAndPriorityValue() {
     final Configuration conf = HBaseConfiguration.create();
-    CoprocessorHost<RegionCoprocessor, CoprocessorEnvironment<RegionCoprocessor>> host =
-        new CoprocessorHost<RegionCoprocessor, CoprocessorEnvironment<RegionCoprocessor>>(
-            new TestAbortable()) {
-          @Override
-          public RegionCoprocessor checkAndGetInstance(Class<?> implClass)
-              throws InstantiationException, IllegalAccessException {
-            if(RegionCoprocessor.class.isAssignableFrom(implClass)) {
-              return (RegionCoprocessor)implClass.newInstance();
-            }
-            return null;
-          }
-
-          final Configuration cpHostConf = conf;
-
-      @Override
-      public CoprocessorEnvironment<RegionCoprocessor> createEnvironment(
-          final RegionCoprocessor instance, final int priority, int sequence, Configuration conf) {
-        return new BaseEnvironment<RegionCoprocessor>(instance, priority, 0, cpHostConf);
-      }
-    };
     final String key = "KEY";
     final String coprocessor = "org.apache.hadoop.hbase.coprocessor.SimpleRegionObserver";
+
+    CoprocessorHost<RegionCoprocessor, CoprocessorEnvironment<RegionCoprocessor>> host;
+    host = new CoprocessorHostForTest<>(conf);
+
     // Try and load a coprocessor three times
     conf.setStrings(key, coprocessor, coprocessor, coprocessor,
         SimpleRegionObserverV2.class.getName());
     host.loadSystemCoprocessors(conf, key);
+
     // Two coprocessors(SimpleRegionObserver and SimpleRegionObserverV2) loaded
     Assert.assertEquals(2, host.coprocEnvironments.size());
+
     // Check the priority value
-    CoprocessorEnvironment simpleEnv = host.findCoprocessorEnvironment(
+    CoprocessorEnvironment<?> simpleEnv = host.findCoprocessorEnvironment(
         SimpleRegionObserver.class.getName());
-    CoprocessorEnvironment simpleEnv_v2 = host.findCoprocessorEnvironment(
+    CoprocessorEnvironment<?> simpleEnv_v2 = host.findCoprocessorEnvironment(
         SimpleRegionObserverV2.class.getName());
+
     assertNotNull(simpleEnv);
     assertNotNull(simpleEnv_v2);
     assertEquals(Coprocessor.PRIORITY_SYSTEM, simpleEnv.getPriority());
     assertEquals(Coprocessor.PRIORITY_SYSTEM + 1, simpleEnv_v2.getPriority());
   }
-  public static class SimpleRegionObserverV2 extends SimpleRegionObserver {
+
+  public static class SimpleRegionObserverV2 extends SimpleRegionObserver { }
+
+  private static class CoprocessorHostForTest<E extends Coprocessor> extends
+      CoprocessorHost<E, CoprocessorEnvironment<E>> {
+    final Configuration cpHostConf;
+
+    public CoprocessorHostForTest(Configuration conf) {
+      super(new TestAbortable());
+      cpHostConf = conf;
+    }
+
+    @Override
+    public E checkAndGetInstance(Class<?> implClass)
+        throws InstantiationException, IllegalAccessException {
+      try {
+        return (E) implClass.getDeclaredConstructor().newInstance();
+      } catch (InvocationTargetException | NoSuchMethodException e) {
+        throw (InstantiationException) new InstantiationException().initCause(e);
+      }
+    }
+
+    @Override
+    public CoprocessorEnvironment<E> createEnvironment(final E instance, final int priority,
+        int sequence, Configuration conf) {
+      return new BaseEnvironment<>(instance, priority, 0, cpHostConf);
+    }
   }
 }