import java.lang.invoke.MethodHandle; import java.util.Arrays; import java.util.List; import static java.lang.invoke.MethodHandles.publicLookup; import static java.lang.invoke.MethodType.methodType; public class VarArgMethodHandle { public static void main(String... args) throws Throwable { MethodHandle MH_asList = publicLookup().findStatic(Arrays.class, "asList", methodType(List.class, Object[].class)); System.out.println(MH_asList.invoke("one", "two").toString()); System.out.println(MH_asList.invokeExact("one", "two").toString()); System.out.println(MH_asList.invokeExact(new Object[] {"one", "two"}).toString()); System.out.println(MH_asList.invoke(new Object[] {"one", "two"}).toString()); MethodHandle MH_main = publicLookup().findStatic(VarArgMethodHandle.class, "main", methodType(void.class, String[].class)); System.out.println(MH_main.invoke("one", "two").toString()); System.out.println(MH_main.invoke(new String[] {"one", "two"}).toString()); System.out.println(MH_main.invoke(new Object[] {"one", "two"}).toString()); System.out.println(MH_main.invoke(1, 2).toString()); System.out.println(MH_main.invokeExact("one", "two").toString()); System.out.println(MH_main.invokeExact(1, 2).toString()); System.out.println(MH_main.invokeExact(new String[] {"one", "two"}).toString()); System.out.println(MH_main.invokeExact(new Object[] {"one", "two"}).toString()); MethodHandle MH_vararg = publicLookup().findStatic(VarArgMethodHandle.class, "vararg", methodType(void.class, Object.class, Object[].class)); MethodHandle MH_vararg2 = publicLookup().findStatic(VarArgMethodHandle.class, "vararg2", methodType(void.class, Object.class, String[].class)); MH_vararg.invoke(1); MH_vararg.invoke(1, 2); MH_vararg.invoke(1, 2, 3); MH_vararg.invokeExact(1, 2, 3); MH_vararg2.invoke(1); MH_vararg2.invoke(1, 2); MH_vararg2.invoke(1, 2, 3); MH_vararg2.invokeExact(1, 2, 3); MH_vararg2.invoke(1, "x"); MH_vararg2.invoke(1, "x", "y"); MH_vararg2.invokeExact(1, "x", "y"); } public static void vararg(T first, T... rest) {} public static void vararg2(Object first, String... rest) {} }