code: @Override
    public final Object invoke(Object proxy, Method method, Object @Nullable [] args)
        throws Throwable {
      if (args == null) {
        args = NO_ARGS;
      }
      if (args.length == 0 && method.getName().equals("hashCode")) {
        return hashCode();
      }
      if (args.length == 1
          && method.getName().equals("equals")
          && method.getParameterTypes()[0] == Object.class) {
        Object arg = args[0];
        if (arg == null) {
          return false;
        }
        if (proxy == arg) {
          return true;
        }
        return isProxyOfSameInterfaces(arg, proxy.getClass())
            && equals(Proxy.getInvocationHandler(arg));
      }
      if (args.length == 0 && method.getName().equals("toString")) {
        return toString();
      }
      return handleInvocation(proxy, method, args);
    }
docs: {@inheritDoc}
  
  <ul>
  <li>{@code proxy.hashCode()} delegates to {@link AbstractInvocationHandler#hashCode}
  <li>{@code proxy.toString()} delegates to {@link AbstractInvocationHandler#toString}
  <li>{@code proxy.equals(argument)} returns true if:
  <ul>
  <li>{@code proxy} and {@code argument} are of the same type
  <li>and {@link AbstractInvocationHandler#equals} returns true for the {@link
  InvocationHandler} of {@code argument}
  </ul>
  <li>other method calls are dispatched to {@link #handleInvocation}.
  </ul>