code: private static boolean fireAfterInvocation(Object runner, Object target, FrameworkMethod method, Throwable thrown) {
          if ((runner != null) && (method != null)) {
              DepthGauge depthGauge = LifecycleHooks.computeIfAbsent(methodDepth.get(), methodHash(runner, method), newInstance);
              if (0 == depthGauge.decreaseDepth()) {
                  if (LOGGER.isDebugEnabled()) {
                      LOGGER.debug("afterInvocation: {}", LifecycleHooks.invoke(runner, "describeChild", method));
                  }
                  synchronized(methodWatcherLoader) {
                      for (MethodWatcher watcher : methodWatcherLoader) {
                          watcher.afterInvocation(runner, target, method, thrown);
                      }
                  }
                  return true;
              }
          }
          return false;
      }
docs: Fire the {@link MethodWatcher#afterInvocation(Object, Object, FrameworkMethod, Throwable) event.
  <p>
  If the {@code afterInvocation} event for the specified method has already been fired, do nothing.
  
  @param runner JUnit test runner
  @param target "enhanced" object upon which the method was invoked
  @param method {@link FrameworkMethod} object for the invoked method
  @param thrown exception thrown by method; null on normal completion
  @return {@code true} if event the {@code afterInvocation} was fired; otherwise {@code false}