MethodHandles.FoldArguments 方法

定义

重载

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

组合参数后调用的方法句柄

pos
Int32

开始折叠的位置以及插入折叠结果的位置:如果为, 0则效果与该 #foldArguments(MethodHandle, MethodHandle)效果相同。

combiner
MethodHandle

最初调用传入参数的方法句柄

返回

包含指定参数折叠逻辑的方法句柄

属性

注解

通过预处理某些参数(从给定位置开始)来调整目标方法句柄,然后使用预处理的结果调用目标,并将其插入到折叠参数之前的原始参数序列中。

此方法与此方法密切相关 #foldArguments(MethodHandle, MethodHandle),但允许控制参数列表中发生折叠的位置。 控制此 pos参数的参数是从零开始的索引。 上述方法 #foldArguments(MethodHandle, MethodHandle) 假定位置 0。

已在 9 中添加。

适用于 . 的 java.lang.invoke.MethodHandles.foldArguments(java.lang.invoke.MethodHandle, int, java.lang.invoke.MethodHandle)Java 文档

本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。

适用于

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

组合参数后调用的方法句柄

combiner
MethodHandle

最初调用传入参数的方法句柄

返回

包含指定参数折叠逻辑的方法句柄

属性

注解

通过预处理某些参数来调整目标方法句柄,然后使用预处理的结果调用目标,并将其插入到原始参数序列中。

预处理由 combiner第二个方法句柄执行。 在传递给适配器的参数中,第一个 N 参数将复制到合并器,然后调用该组合器。 (此处, N 定义为组合器的参数计数。之后,控件将传递到目标,其中合并器在原始 N 传入参数之前插入的任何结果。

如果合并器返回一个值,则目标的第一个参数类型必须与合并器返回类型相同,并且目标的下一 N 个参数类型必须与合并器的参数完全匹配。

如果合并器返回 void,则不会插入任何结果,并且目标的第一个 N 参数类型必须与合并器的参数完全匹配。

生成的适配器与目标的类型相同,但如果第一个参数类型与合并器的结果相对应,则删除第一个参数类型。

(请注意, #dropArguments(MethodHandle,int,List) dropArguments 可用于删除组合器或目标不希望接收的任何参数。如果某些传入参数只针对组合器,请考虑改用 MethodHandle#asCollector asCollector ,因为这些参数不需要位于目标条目的堆栈上。

<b>示例:</b><blockquote>

{@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"));
            }

</blockquote>

下面是生成的适配器的伪代码。 在代码中, T 表示生成的适配器的结果类型 targetV/v 表示折叠位置前的参数和参数 target 的类型和值; V 也是结果类型的 combiner值。 A/a 表示折叠位置的参数和参数的类型和值 NB/b 表示以下折叠参数和参数的类型 target 和值。 <blockquote>

{@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...);
            }
            }

</blockquote>

<em>Note:</em> 生成的适配器绝不是 MethodHandle#asVarargsCollector variable-arity 方法句柄,即使原始目标方法句柄是。

适用于 . 的 java.lang.invoke.MethodHandles.foldArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)Java 文档

本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。

适用于