MethodHandles.PermuteArguments(MethodHandle, MethodType, Int32[]) 方法

定义

通过重新排序参数,生成一个方法句柄,该方法将给定方法句柄的调用序列改编为新类型。

[Android.Runtime.Register("permuteArguments", "(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;[I)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)]
public static Java.Lang.Invoke.MethodHandle? PermuteArguments (Java.Lang.Invoke.MethodHandle? target, Java.Lang.Invoke.MethodType? newType, params int[]? reorder);
[<Android.Runtime.Register("permuteArguments", "(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;[I)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)>]
static member PermuteArguments : Java.Lang.Invoke.MethodHandle * Java.Lang.Invoke.MethodType * int[] -> Java.Lang.Invoke.MethodHandle

参数

target
MethodHandle

在重新排序自变量后调用的方法句柄

newType
MethodType

新方法句柄的预期类型

reorder
Int32[]

控制重新排序的索引数组

返回

一个方法句柄,该方法在删除未使用的参数并移动和/或复制其他参数后委托给目标

属性

注解

通过重新排序参数,生成一个方法句柄,该方法将给定方法句柄的调用序列改编为新类型。 生成的方法句柄可以保证报告等于所需新类型的类型。

给定的数组控制重新排序。 调用 #I 传入参数的数量(值 newType.parameterCount(),并调用 #O 传出参数数(值 target.type().parameterCount())。 然后,重新排序数组的长度必须是 #O,并且每个元素必须是小于 #I的非负数。 对于每一个N小于#ON第 -th 传出参数将取自I传入参数,其中Ireorder[N]

不应用任何参数或返回值转换。 每个传入参数的类型(由确定) newType必须与目标方法句柄中相应传出参数的类型相同。 返回类型 newType 必须与原始目标的返回类型相同。

重新排序数组不需要指定实际的排列。 如果传入参数在数组中出现多次,则传入参数将重复,如果传入参数未出现在数组中,则将删除该参数。 与上述情况#dropArguments(MethodHandle,int,List) dropArguments一样,重新排序数组中未提及的传入参数可以是任何类型的,仅由以下决定:newType <blockquote>

{@code
            import static java.lang.invoke.MethodHandles.*;
            import static java.lang.invoke.MethodType.*;
            ...
            MethodType intfn1 = methodType(int.class, int.class);
            MethodType intfn2 = methodType(int.class, int.class, int.class);
            MethodHandle sub = ... (int x, int y) -> (x-y) ...;
            assert(sub.type().equals(intfn2));
            MethodHandle sub1 = permuteArguments(sub, intfn2, 0, 1);
            MethodHandle rsub = permuteArguments(sub, intfn2, 1, 0);
            assert((int)rsub.invokeExact(1, 100) == 99);
            MethodHandle add = ... (int x, int y) -> (x+y) ...;
            assert(add.type().equals(intfn2));
            MethodHandle twice = permuteArguments(add, intfn1, 0, 0);
            assert(twice.type().equals(intfn1));
            assert((int)twice.invokeExact(21) == 42);
            }

</blockquote>

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

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

适用于