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) {}
}