code: @SuppressWarnings("unchecked")
      static <T> T invoke(Object target, String methodName, Object... parameters) {
          Class<?>[] parameterTypes = new Class<?>[parameters.length];
          for (int i = 0; i < parameters.length; i++) {
              parameterTypes[i] = parameters[i].getClass();
          }
          
          Throwable thrown = null;
          for (Class<?> current = target.getClass(); current != null; current = current.getSuperclass()) {
              try {
                  Method method = current.getDeclaredMethod(methodName, parameterTypes);
                  method.setAccessible(true);
                  return (T) method.invoke(target, parameters);
              } catch (NoSuchMethodException e) {
                  thrown = e;
              } catch (SecurityException | IllegalAccessException | IllegalArgumentException
                              | InvocationTargetException e) {
                  thrown = e;
                  break;
              }
          }
          
          throw UncheckedThrow.throwUnchecked(thrown);
      }
docs: Invoke the named method with the specified parameters on the specified target object.
  
  @param <T> method return type
  @param target target object
  @param methodName name of the desired method
  @param parameters parameters for the method invocation
  @return result of method invocation