asCollector
asCollector(Class arrayClass, int arrayLength) は arrayType の引数を指定した数の引数のリストに変えてくれる。asSpreader はほぼその反対。
import java.lang.invoke.*; import static java.lang.invoke.MethodType.*; import static java.lang.invoke.MethodHandles.*; public class AsCollectorEx { public static void main(String[] args) throws Throwable { Lookup lookup = lookup(); MethodHandle m0 = lookup.findStatic(AsCollectorEx.class, "printAll", methodType(void.class, Object[].class)); P("m0 : " + m0); MethodHandle mcoll = m0.asCollector(Object[].class, 4); mcoll = mcoll.asType(methodType(void.class, String.class, String.class, String.class, String.class)); P("mcoll: " + mcoll); mcoll.invokeExact("Foo", "Bar", "Fizz", "Buzz"); Object[] params = new Object[] {"Foo", "Bar", "Fizz", "Buzz"}; MethodHandle mspr = mcoll.asSpreader(Object[].class, 4); P("mspr: " + mspr); mspr.invokeExact(params); } public static void printAll(Object[] args) { StringBuilder sb = new StringBuilder(); sb.append("("); for (Object o : args) sb.append(o == null ? "(null) " : o.toString() + " "); sb.append(")"); System.out.println(sb.toString()); } static void P(Object o) { System.out.println(o); } }
m0 : MethodHandle(Object)void mcoll: MethodHandle(Object,Object,Object,Object)void (Foo Bar Fizz Buzz ) mspr: MethodHandle(Object)void (Foo Bar Fizz Buzz )