@InterfaceAudience.Private
  protected void validateTables(ClassLoader classLoader, Admin admin, Pattern pattern,
    List<CoprocessorViolation> violations) throws IOException {
    List<TableDescriptor> tableDescriptors = admin.listTableDescriptors(pattern);

    for (TableDescriptor tableDescriptor : tableDescriptors) {
      LOG.debug("Validating table {}", tableDescriptor.getTableName());

      Collection<CoprocessorDescriptor> coprocessorDescriptors =
        tableDescriptor.getCoprocessorDescriptors();

      for (CoprocessorDescriptor coprocessorDescriptor : coprocessorDescriptors) {
        String className = coprocessorDescriptor.getClassName();
        Optional<String> jarPath = coprocessorDescriptor.getJarPath();

        if (jarPath.isPresent()) {
          org.apache.hadoop.fs.Path path = new org.apache.hadoop.fs.Path(jarPath.get());
          try (ResolverUrlClassLoader cpClassLoader = createClassLoader(classLoader, path)) {
            validate(cpClassLoader, className, violations);
          } catch (IOException e) {
            CoprocessorViolation violation = new CoprocessorViolation(className, Severity.ERROR,
              "could not validate jar file '" + path + "'", e);
            violations.add(violation);
          }
        } else {
          validate(classLoader, className, violations);
        }
      }
    }
  }
This classloader implementation calls {@link #resolveClass(Class)} method for every loaded
class. It means that some extra validation will take place
<a href="https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.3"> according to
JLS</a>.
hbase-server/src/main/java/org/apache/hadoop/hbase/tool/coprocessor/CoprocessorValidator.java