MethodHandle (@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); }); }