MethodHandles.FoldArguments 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
多載
| 名稱 | Description |
|---|---|
| FoldArguments(MethodHandle, Int32, MethodHandle) |
透過預處理部分參數,從指定位置開始,然後呼叫目標,將預處理結果插入原始參數序列中,位於摺疊參數之前。 |
| FoldArguments(MethodHandle, MethodHandle) |
透過預處理部分參數,然後將預處理結果插入原始參數序列中,來調整目標方法的句點。 |
FoldArguments(MethodHandle, Int32, MethodHandle)
透過預處理部分參數,從指定位置開始,然後呼叫目標,將預處理結果插入原始參數序列中,位於摺疊參數之前。
[Android.Runtime.Register("foldArguments", "(Ljava/lang/invoke/MethodHandle;ILjava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=33)]
public static Java.Lang.Invoke.MethodHandle? FoldArguments(Java.Lang.Invoke.MethodHandle? target, int pos, Java.Lang.Invoke.MethodHandle? combiner);
[<Android.Runtime.Register("foldArguments", "(Ljava/lang/invoke/MethodHandle;ILjava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=33)>]
static member FoldArguments : Java.Lang.Invoke.MethodHandle * int * Java.Lang.Invoke.MethodHandle -> Java.Lang.Invoke.MethodHandle
參數
- target
- MethodHandle
組合參數後呼叫的方法 handle
- pos
- Int32
開始摺疊及插入摺疊的位置;若為 0,則效果與 時相同。#foldArguments(MethodHandle, MethodHandle)
- combiner
- MethodHandle
method handle 用於對輸入參數的初始呼叫
傳回
方法句柄,包含指定的參數摺疊邏輯
- 屬性
備註
透過預處理部分參數,從指定位置開始,然後呼叫目標,將預處理結果插入原始參數序列中,位於摺疊參數之前。
此方法與 #foldArguments(MethodHandle, MethodHandle)密切相關,但允許控制參數列表中摺疊發生的位置。 控制此參數 pos的參數為零基索引。 上述方法 #foldArguments(MethodHandle, MethodHandle) 假設位置為0。
新增9。
本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。
適用於
FoldArguments(MethodHandle, MethodHandle)
透過預處理部分參數,然後將預處理結果插入原始參數序列中,來調整目標方法的句點。
[Android.Runtime.Register("foldArguments", "(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)]
public static Java.Lang.Invoke.MethodHandle? FoldArguments(Java.Lang.Invoke.MethodHandle? target, Java.Lang.Invoke.MethodHandle? combiner);
[<Android.Runtime.Register("foldArguments", "(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)>]
static member FoldArguments : Java.Lang.Invoke.MethodHandle * Java.Lang.Invoke.MethodHandle -> Java.Lang.Invoke.MethodHandle
參數
- target
- MethodHandle
組合參數後呼叫的方法 handle
- combiner
- MethodHandle
method handle 用於對輸入參數的初始呼叫
傳回
方法句柄,包含指定的參數摺疊邏輯
- 屬性
備註
透過預處理部分參數,然後將預處理結果插入原始參數序列中,來調整目標方法的句點。
預處理由 combiner第二個方法的 handle 執行。 傳遞給適配器的參數中,最早 N 的參數會被複製到合併器,然後呼叫。 (此處定義 N 為組合器的參數計數。)之後,控制權轉移給目標,並將組合器的任何結果插入於原始 N 輸入參數之前。
若組合器回傳一個值,目標的第一個參數類型必須與組合器的回傳類型相同,而接下來 N 的參數類型必須完全符合組合器的參數。
若合併器有空回波,則不會插入任何結果,且目標的首批 N 參數類型必須與合併器的參數完全相符。
所得的適配器類型與目標相同,但若第一個參數類型對應於組合器結果,則會被捨棄。
(注意 可用 #dropArguments(MethodHandle,int,List) dropArguments 來移除組合器或目標不願接收的任何參數。如果有些輸入參數只要送給組合器,請考慮改用 MethodHandle#asCollector asCollector ,因為這些參數在進入目標時不需要在堆疊中保持活躍。)
<b>範例:</b><引用>
{@code
import static java.lang.invoke.MethodHandles.*;
import static java.lang.invoke.MethodType.*;
...
MethodHandle trace = publicLookup().findVirtual(java.io.PrintStream.class,
"println", methodType(void.class, String.class))
.bindTo(System.out);
MethodHandle cat = lookup().findVirtual(String.class,
"concat", methodType(String.class, String.class));
assertEquals("boojum", (String) cat.invokeExact("boo", "jum"));
MethodHandle catTrace = foldArguments(cat, trace);
// also prints "boo":
assertEquals("boojum", (String) catTrace.invokeExact("boo", "jum"));
}
</區塊引用>
這裡有個偽程式碼,代表產生的轉接器。 在程式碼中,代表 T 和 所產生的轉接器的結果型別 target 。
V
/
v 表示 的參數與參數 target 的值,且該參數位於摺疊位置之前; V 也是 的 combiner結果型態。
A
/
a 表示在摺疊位置參數 N 與參數的類型與值。
B
/
b 表示緊接摺疊參數與參數後的參數與參數的值 target 。
<引用>
{@code
// there are N arguments in A...
T target(V, A[N]..., B...);
V combiner(A...);
T adapter(A... a, B... b) {
V v = combiner(a...);
return target(v, a..., b...);
}
// and if the combiner has a void return:
T target2(A[N]..., B...);
void combiner2(A...);
T adapter2(A... a, B... b) {
combiner2(a...);
return target2(a..., b...);
}
}
</區塊引用>
<em>注意:</em> 產生的適配器從來不是 MethodHandle#asVarargsCollector 可變元度方法的 handle,即使原本的目標方法是 handle。
本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。