MethodHandles.CollectArguments(MethodHandle, Int32, MethodHandle) 方法

定义

通过使用筛选器(另一个方法句柄)预处理其参数的子序列来调整目标方法句柄。

[Android.Runtime.Register("collectArguments", "(Ljava/lang/invoke/MethodHandle;ILjava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)]
public static Java.Lang.Invoke.MethodHandle? CollectArguments(Java.Lang.Invoke.MethodHandle? target, int pos, Java.Lang.Invoke.MethodHandle? filter);
[<Android.Runtime.Register("collectArguments", "(Ljava/lang/invoke/MethodHandle;ILjava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)>]
static member CollectArguments : Java.Lang.Invoke.MethodHandle * int * Java.Lang.Invoke.MethodHandle -> Java.Lang.Invoke.MethodHandle

参数

target
MethodHandle

筛选参数子序列后要调用的方法句柄

pos
Int32

要传递给筛选器的第一个适配器参数的位置,以及/或接收筛选器结果的目标参数的位置

filter
MethodHandle

方法句柄,用于调用参数的子序列

返回

包含指定参数子序列筛选逻辑的方法句柄

属性

注解

通过使用筛选器(另一个方法句柄)预处理其参数的子序列来调整目标方法句柄。 预处理的参数将替换为筛选器函数的结果(如果有)。 然后,在修改的(通常缩短)参数列表中调用目标。

如果筛选器返回一个值,则目标必须接受该值作为其参数的位置 pos、前面和/或后跟未传递给筛选器的任何参数。 如果筛选器返回 void,则目标必须接受未传递给筛选器的所有参数。 无参数重新排序,并且从筛选器返回的结果将替换最初传递给适配器的整个参数的子序列(顺序)。

筛选器的参数类型(如果有)将替换目标(位置 pos)的零种或一个参数类型,在生成的调整方法句柄中。 筛选器的返回类型(如果有)必须与目标位置 pos的参数类型相同,并且该目标参数由筛选器的返回值提供。

在所有情况下, pos 必须大于或等于零,并且 pos 还必须小于或等于目标的 arity。

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

{@code
            import static java.lang.invoke.MethodHandles.*;
            import static java.lang.invoke.MethodType.*;
            ...
            MethodHandle deepToString = publicLookup()
              .findStatic(Arrays.class, "deepToString", methodType(String.class, Object[].class));

            MethodHandle ts1 = deepToString.asCollector(String[].class, 1);
            assertEquals("[strange]", (String) ts1.invokeExact("strange"));

            MethodHandle ts2 = deepToString.asCollector(String[].class, 2);
            assertEquals("[up, down]", (String) ts2.invokeExact("up", "down"));

            MethodHandle ts3 = deepToString.asCollector(String[].class, 3);
            MethodHandle ts3_ts2 = collectArguments(ts3, 1, ts2);
            assertEquals("[top, [up, down], strange]",
                         (String) ts3_ts2.invokeExact("top", "up", "down", "strange"));

            MethodHandle ts3_ts2_ts1 = collectArguments(ts3_ts2, 3, ts1);
            assertEquals("[top, [up, down], [strange]]",
                         (String) ts3_ts2_ts1.invokeExact("top", "up", "down", "strange"));

            MethodHandle ts3_ts2_ts3 = collectArguments(ts3_ts2, 1, ts3);
            assertEquals("[top, [[up, down, strange], charm], bottom]",
                         (String) ts3_ts2_ts3.invokeExact("top", "up", "down", "strange", "charm", "bottom"));
            }

</blockquote>

下面是生成的适配器的伪代码: <blockquote>

{@code
            T target(A...,V,C...);
            V filter(B...);
            T adapter(A... a,B... b,C... c) {
              V v = filter(b...);
              return target(a...,v,c...);
            }
            // and if the filter has no arguments:
            T target2(A...,V,C...);
            V filter2();
            T adapter2(A... a,C... c) {
              V v = filter2();
              return target2(a...,v,c...);
            }
            // and if the filter has a void return:
            T target3(A...,C...);
            void filter3(B...);
            void adapter3(A... a,B... b,C... c) {
              filter3(b...);
              return target3(a...,c...);
            }
            }

</blockquote>

集合适配器 collectArguments(mh, 0, coll) 等效于第一个“折叠”受影响的参数,然后在单独的步骤中删除它们,如下所示: <blockquote>

{@code
            mh = MethodHandles.dropArguments(mh, 1, coll.type().parameterList()); //step 2
            mh = MethodHandles.foldArguments(mh, coll); //step 1
            }

</blockquote> 如果目标方法句柄不使用除筛选器 coll的结果(如果有)之外的任何参数,则 collectArguments(mh, 0, coll) 等效于 filterReturnValue(coll, mh)。 如果筛选器方法句柄 coll 使用一个参数并生成非 void 结果,则 collectArguments(mh, N, coll) 等效于 filterArguments(mh, N, coll)。 其他等效性是可能的,但需要参数排列。

Java文档java.lang.invoke.MethodHandles.collectArguments(java.lang.invoke.MethodHandle, int, java.lang.invoke.MethodHandle)

本页的某些部分是根据 创建和共享的工作进行的修改,并根据 许可证中所述的条款使用。

适用于