java.lang.invoke
CallSite site = LambdaMetafactory.metafactory(
java.lang.invoke.MethodHandles.lookup(),
"hello",
MethodType.methodType(void.class, String.class),
LambdaMetafactory.FLAG_PUBLIC | LambdaMetafactory.FLAG_FINAL,
MethodType.methodType(String.class),
"sayHello"
);
site.dynamicInvoker().invoke("John"); // Prints "Hello John!"MethodHandle mh = MethodHandles.lookup().findVirtual(
String.class, "toUpperCase", MethodType.methodType(String.class)
);
MethodHandle mhCustom = MethodHandles.filterArguments(
mh, 0, String.class, String::toUpperCase
);
System.out.println(mhCustom.invoke("hello")); // Prints "HELLO"