private void validate(ClassLoader classLoader, String className,
    List<CoprocessorViolation> violations) {
    LOG.debug("Validating class '{}'.", className);

    try {
      Class<?> clazz = classLoader.loadClass(className);

      for (Method method : clazz.getDeclaredMethods()) {
        LOG.trace("Validating method '{}'.", method);

        if (branch1.hasMethod(method) && !current.hasMethod(method)) {
          CoprocessorViolation violation =
            new CoprocessorViolation(className, Severity.WARNING, "method '" + method
              + "' was removed from new coprocessor API, so it won't be called by HBase");
          violations.add(violation);
        }
      }
    } catch (ClassNotFoundException e) {
      CoprocessorViolation violation =
        new CoprocessorViolation(className, Severity.ERROR, "no such class", e);
      violations.add(violation);
    } catch (RuntimeException | Error e) {
      CoprocessorViolation violation =
        new CoprocessorViolation(className, Severity.ERROR, "could not validate class", e);
      violations.add(violation);
    }
  }
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