docs: public Object invoke(final Object proxy, Method method, Object[] args) throws Throwable {
          if (handleCache != null && isDefaultMethod(method) && !defaultOverridden(method)) {
              final VMPlugin plugin = VMPluginFactory.getPlugin();
              Object handle = handleCache.computeIfAbsent(method, m -> plugin.getInvokeSpecialHandle(m, proxy));
              return plugin.invokeHandle(handle, args);
          }
  
          if (!checkMethod(method)) {
              try {
                  if (method.getDeclaringClass() == GroovyObject.class) {
                      if ("getMetaClass".equals(method.getName())) {
                          return getMetaClass(proxy);
                      } else if ("setMetaClass".equals(method.getName())) {
                          return setMetaClass((MetaClass) args[0]);
                      }
                  }
                  return invokeCustom(proxy, method, args);
              } catch (GroovyRuntimeException gre) {
                  throw ScriptBytecodeAdapter.unwrap(gre);
              }
          }
  
          try {
              return method.invoke(this, args);
          } catch (InvocationTargetException ite) {
              throw ite.getTargetException();
          }
      }