static @NotNull MethodHandle compute(@NotNull Method method, Object @Nullable [] args) {
    // method name cannot be used as a key because for one class maybe several methods with the same name and different set of parameters
    return CACHE.get(method.getDeclaringClass()).computeIfAbsent(method, method1 -> {
      method1.setAccessible(true);
      MethodHandle result;
      try {
        result = LOOKUP.unreflect(method1);
      }
      catch (IllegalAccessException e) {
        throw new RuntimeException(e);
      }
      return args == null ? result : result.asSpreader(Object[].class, args.length);
    });
  }
static @NotNull MethodHandle compute(@NotNull Method method, Object @Nullable [] args)