MethodHandles.FoldArguments 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
重载
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 中添加。
本页的某些部分是根据 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
表示生成的适配器的结果类型 target
。 V
/v
表示折叠位置前的参数和参数 target
的类型和值; V
也是结果类型的 combiner
值。 A
/a
表示折叠位置的参数和参数的类型和值 N
。 B
/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 方法句柄,即使原始目标方法句柄是。
本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。