code: public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
          VMPlugin plugin = VMPluginFactory.getPlugin();
          if (plugin.getVersion()>=7 && isDefaultMethod(method)) {
              Object handle = handleCache.get(method);
              if (handle == null) {
                  handle = plugin.getInvokeSpecialHandle(method, proxy);
                  handleCache.put(method, handle);
              }
              return plugin.invokeHandle(handle, args);
          }
  
          if (!checkMethod(method)) {
              try {
                  return invokeCustom(proxy, method, args);
              } catch (GroovyRuntimeException gre) {
                  throw ScriptBytecodeAdapter.unwrap(gre);
              }
          }
  
          try {
              return method.invoke(this, args);
          } catch (InvocationTargetException ite) {
              throw ite.getTargetException();
          }
      }
docs: This method is a default implementation for the invoke method given in
  InvocationHandler. Any call to a method with a declaring class that is
  not Object, excluding toString() and default methods is redirected to invokeCustom.
  <p>
  Methods like equals and hashcode are called on the class itself instead
  of the delegate because they are considered fundamental methods that should
  not be overwritten. The toString() method gets special treatment as it is
  deemed to be a method that you might wish to override when called from Groovy.
  Interface default methods from Java 8 on the other hand are considered being
  default implementations you don't normally want to change. So they are called
  directly too
  </p><p>
  In many scenarios, it is better to overwrite the invokeCustom method where
  the core Object related methods are filtered out.
  </p>
  @param proxy  the proxy
  @param method the method
  @param args   the arguments
  @return the result of the invocation by method or delegate
  @throws Throwable if caused by the delegate or the method
  @see #invokeCustom(Object, Method, Object[])
  @see InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])