code: @SuppressWarnings("unchecked")
    public static <R> R callStaticMethod(Class<?> clazz, String methodName, ClassParameter<?>... classParameters) {
      try {
        Class<?>[] classes = ClassParameter.getClasses(classParameters);
        Object[] values = ClassParameter.getValues(classParameters);
  
        Method method = clazz.getDeclaredMethod(methodName, classes);
        method.setAccessible(true);
        if (!Modifier.isStatic(method.getModifiers())) {
          throw new IllegalArgumentException(method + " is not static");
        }
        return (R) method.invoke(null, values);
      } catch (InvocationTargetException e) {
        if (e.getTargetException() instanceof RuntimeException) {
          throw (RuntimeException) e.getTargetException();
        }
        if (e.getTargetException() instanceof Error) {
          throw (Error) e.getTargetException();
        }
        throw new RuntimeException(e.getTargetException());
      } catch (NoSuchMethodException e) {
        throw new RuntimeException("no such method " + clazz + "." + methodName, e);
      } catch (Exception e) {
        throw new RuntimeException(e);
      }
    }
docs: Reflectively call a static method on a class.
  
  @param clazz Target class.
  @param methodName The method name to call.
  @param classParameters Array of parameter types and values.
  @param <R> The return type.
  @return The return value of the method.