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
則會從 I
-th 傳入自變數取得 -th 傳出自變數,其中 是 reorder[N]
N
#O
I
不會套用自變數或傳回值轉換。 由 決定 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 屬性授權中所述的詞彙使用。