MethodHandles.PermuteArguments(MethodHandle, MethodType, Int32[]) 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
通过重新排序参数,生成一个方法句柄,该方法将给定方法句柄的调用序列改编为新类型。
[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
小于#O
,N
第 -th 传出参数将取自I
传入参数,其中I
。reorder[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>
本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。