code: @Override
    public Object invoke(Object proxy, Method method, Object[] args) /* CSOFF: IllegalThrows */
                  throws Throwable /* CSON: IllegalThrows */ {
      final long startTime = System.currentTimeMillis();
      Object result = null;
      try {
        result = method.invoke(target, args);
        if ((result != null) && !method.getReturnType().equals(Void.TYPE) && method.getReturnType().isInterface()) {
          result = wrapObject(method.getReturnType(), result, reporter);
        }
      } catch (InvocationTargetException t) {
        if (t.getCause() != null) {
          throw t.getCause();
        }
      } finally {
        final long endTime = System.currentTimeMillis();
        reporter.reportTimedOperation(targetClass, method, startTime, endTime);
      }
      return result;
    }
docs: Handles method invocations on the generated proxy. Measures the time needed
  to execute the given method on the wrapped object.
  
  @see java.lang.reflect.InvocationHandler#invoke(Object, java.lang.reflect.Method, Object[])