語言

MethodHandles.FoldArguments 方法

定義

多載

名稱 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。

的 java.lang.invoke.MethodHandles.foldArguments(java.lang.invoke.MethodHandle, int, java.lang.invoke.MethodHandle)Java 檔。

本頁部分內容為基於 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。

的 java.lang.invoke.MethodHandles.foldArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)Java 檔。

本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。

適用於