2016-05-30 24 views
1

在Java中使用的參數,我能夠多方法處理每一它的參數相結合,這樣的:Java MethodHandle;在多個地點

foo(a, bar(2, b)) 

..by使用MethodHandles.collectArguments()

的方法處理,我得到可以這樣調用:

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

但現在,我想獲得一個方法搞定調度其參數到調用樹是這樣的:

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));' 

我無法圍繞如何做到這一點。你可以幫我嗎?

回答

2

像往常一樣對Java方法處理,沒有太大的興趣,所以我會給你答案:

使用MethodHandles::permuteArguments與MethodType聯合:: dropPatameterTypes()調用。

對我來說,那簡直就是這樣的問題:

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

我不會說,有「沒有太大的興趣」,但'methodhandle'標籤,有41題,是相當狹窄。添加[標籤:反射]或[標籤:字節碼],但不完全匹配問題可能會引起注意。 – Holger