import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.util.Arrays;

interface MyFunctionalInterface {
    Object invokeMethodReference(Object... args) throws Throwable;
}

class MyClass {
    public String add(String a, int b, long... cs) {
        return this.toString() + ", " + a + ", " + b + ", " + Arrays.toString(cs);
    }
}

public class Test2 {
    public static void main(String argv[]) throws Throwable {
        MethodHandles.Lookup lookup = MethodHandles.lookup();
        MethodType mt = MethodType.methodType(String.class, String.class, int.class, long[].class);
        MethodHandle ms = lookup.findVirtual(MyClass.class, "add", mt);
        MyFunctionalInterface instance = (ms)::invoke;
        System.out.println(ms.invoke(new MyClass(), "b", 4, 5));
        Object result = instance.invokeMethodReference(new MyClass(), "b", 4, 5);
    }
}