2016-05-30 10 views
1

In Java, ich bin mit jedem seiner Parameter mehrere Verfahren Griff kombinieren können, wie folgt aus:Java MethodHandle; verwenden Parameter an mehreren Standorten

foo(a, bar(2, b)) 

.by MethodHandles.collectArguments() verwenden.

myHandle.invokeExact(5, 6); // invokes foo(5, bar(2, 6)) 

Aber jetzt, würde Ich mag eine Methode Griff bekommen, die ihre Parameter in der Aufrufstruktur wie folgt entsendet:

Verfahren handle ich so bekommen kann aufgerufen werden

MethodHandle myHandle = ...; // foo(*x*, bar(2, *x*)) 
myHandle.invokeExact(3); // replaces x by 3 in both locations 
// this call represents 'foo(3, bar(2, 3));' 

Ich kann mir nicht vorstellen, wie das geht. Kannst du mir helfen?

Antwort

2

Wie üblich für Java Methode behandelt, nicht viel Interesse, also werde ich Ihnen die Antwort geben:

Verwenden MethodHandles::permuteArguments mit einem Method kombiniert :: dropPatameterTypes() -Aufruf.

In meinem Fall ist es einfach eine Sache, dies zu tun:

MethodHandle handle = [...]; // method handle representing f(x1, x2) = x1 + (x2 - 2) 
MethodHandle h_permute = MethodHandles.permuteArguments(
    handle, 
    handle.type().dropParameterTypes(1, 2), // new handle type with 1 less param 
    0, 
    0); 
// h_permute now represents f(x) = x + (x - 2) 
+0

würde ich nicht sagen, dass es „nicht viel Interesse“ ist, aber das 'methodhandle' Tag, 41 Fragen hat, ist recht eng. Das Hinzufügen von [Tag: Reflection] oder [Tag: Bytecode] könnte die Aufmerksamkeit erregen, obwohl sie nicht genau zu der Sache passen. – Holger