class DefaultMethodInvokingInterceptor implements MethodInterceptor {

    private final Map<Method, MethodHandle> methodHandleCache = new ConcurrentHashMap<>();

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {

        Method method = invocation.getMethod();

        if (!method.isDefault()) {
            return invocation.proceed();
        }

        LettuceAssert.isTrue(invocation instanceof InvocationTargetProvider,
                "Invocation must provide a target object via InvocationTargetProvider");

        InvocationTargetProvider targetProvider = (InvocationTargetProvider) invocation;

        return methodHandleCache.computeIfAbsent(method, DefaultMethodInvokingInterceptor::lookupMethodHandle)
                .bindTo(targetProvider.getInvocationTarget()).invokeWithArguments(invocation.getArguments());
    }

    private static MethodHandle lookupMethodHandle(Method method) {<FILL_FUNCTION_BODY>}

}

        try {
            return DefaultMethods.lookupMethodHandle(method);
        } catch (ReflectiveOperationException e) {
            throw new IllegalArgumentException(e);
        }
    
<no_super_class>