docs: @Override
      @Trivial
      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  
          // A list of contextual method names can be specified to limit the methods to
          // which context is applied.  Otherwise, context is applied to all methods except
          // for those declared on java.lang.Object (like .equals, .hashCode, .toString)
          String contextualMethods = threadContextDescriptor.getExecutionProperties().get(WSContextService.CONTEXTUAL_METHODS);
          boolean applyContext = contextualMethods == null ?
                          !Object.class.equals(method.getDeclaringClass())
                          : Arrays.asList(contextualMethods.split(",")).contains(method.getName());
  
          try {
              if (applyContext)
                  return invoke(method, args);
              else if (args != null && args.length == 1 && "equals".equals(method.getName())) // special case: Object.equals
                  return proxy == args[0];
              else
                  return method.invoke(object, args);
          } catch (IllegalAccessException x) {
              throw new RejectedExecutionException(x);
          } catch (InvocationTargetException x) {
              throw x.getTargetException();
          }
      }