Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import static java.lang.invoke.MethodHandles.*;
- import static java.lang.invoke.MethodType.methodType;
- import java.lang.invoke.MethodHandle;
- import java.lang.invoke.MethodType;
- public class MethodHandleChain {
- public static void main(String[] args) {
- Class<?> rt = Object.class;
- MethodHandle ctor = empty(methodType(rt, String.class));
- MethodHandle read1 = empty(methodType(void.class, rt, Long.class));
- MethodHandle read2 = empty(methodType(void.class, rt, Integer.class));
- MethodHandle result = identity(rt);
- result = dup(collectArguments(result, 1, read2));
- result = dup(collectArguments(result, 1, read1));
- result = collectArguments(result, 0, ctor);
- System.out.println(result);
- }
- // Duplicates parameter at pos 0
- private static MethodHandle dup(MethodHandle mh) {
- MethodType mt = mh.type();
- if (mt.parameterType(0) != mt.parameterType(1)) {
- throw new IllegalArgumentException("First 2 parameters need to have the same type, got " + mt);
- }
- MethodType newMT = mt.dropParameterTypes(0, 1);
- int[] permutation = new int[mt.parameterCount()];
- permutation[0] = 0;
- for (int i = 0; i < newMT.parameterCount(); i++) {
- permutation[i + 1] = i;
- }
- return permuteArguments(mh, newMT, permutation);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement