共用方式為


MethodHandle.AsSpreader 方法

定義

多載

AsSpreader(Class, Int32)

<讓 em>陣列傳播</em> 方法句柄接受尾端陣列自變數,並將其元素分散為位置自變數。

AsSpreader(Int32, Class, Int32)

<讓em>陣列傳播</em>方法句柄接受位於指定位置的陣列自變數,並將其專案分散為位置自變數來取代數位。

AsSpreader(Class, Int32)

<讓 em>陣列傳播</em> 方法句柄接受尾端陣列自變數,並將其元素分散為位置自變數。

[Android.Runtime.Register("asSpreader", "(Ljava/lang/Class;I)Ljava/lang/invoke/MethodHandle;", "GetAsSpreader_Ljava_lang_Class_IHandler", ApiSince=26)]
public virtual Java.Lang.Invoke.MethodHandle? AsSpreader (Java.Lang.Class? arrayType, int arrayLength);
[<Android.Runtime.Register("asSpreader", "(Ljava/lang/Class;I)Ljava/lang/invoke/MethodHandle;", "GetAsSpreader_Ljava_lang_Class_IHandler", ApiSince=26)>]
abstract member AsSpreader : Java.Lang.Class * int -> Java.Lang.Invoke.MethodHandle
override this.AsSpreader : Java.Lang.Class * int -> Java.Lang.Invoke.MethodHandle

參數

arrayType
Class

通常 Object[],要從中擷取散佈自變數的陣列自變數類型

arrayLength
Int32

要從傳入陣列自變數散佈的自變數數目

傳回

在呼叫原始方法句柄之前,新的方法句柄會分散其最終數位自變數

屬性

備註

<讓 em>陣列傳播</em> 方法句柄接受尾端陣列自變數,並將其元素分散為位置自變數。 新的方法句柄會隨著其 目標調整目前的方法句柄。 配接器的類型會與目標的類型相同,不同之處在於目標類型的最終 arrayLength 參數會由類型的 arrayType單一陣列參數取代。

如果數位專案類型與原始目標上任何對應的自變數類型不同,則會調整原始目標以直接取得數位元素,就像透過呼叫 #asType asType一樣。

呼叫時,配接器會以數位的元素取代尾端陣列自變數,每個自變數都會取代為目標。 (保留自變數的順序。它們會藉由將 和/或 unboxing 轉換成目標的尾端參數類型,以成對方式轉換。 最後會呼叫目標。 目標最終傳回的內容會由配接器傳回不變。

在呼叫目標之前,配接器會驗證數位是否包含足以提供正確自變數計數給目標方法句柄的元素。 (當需要零個元素時,陣列也可能是 Null。

呼叫配接器時,所提供 array 自變數的長度會如同 by array.lengtharraylength bytecode 一樣查詢。 如果配接器接受長度為零的尾端陣列自變數,則提供的array自變數可以是零長度的陣列或 null;否則,如果陣列為 null ,則配接器會擲回 ,如果陣列沒有正確的元素數目,則會擲回 NullPointerException IllegalArgumentException

以下是陣列傳播方法句柄的一些簡單範例: <blockquote>

{@code
            MethodHandle equals = publicLookup()
              .findVirtual(String.class, "equals", methodType(boolean.class, Object.class));
            assert( (boolean) equals.invokeExact("me", (Object)"me"));
            assert(!(boolean) equals.invokeExact("me", (Object)"thee"));
            // spread both arguments from a 2-array:
            MethodHandle eq2 = equals.asSpreader(Object[].class, 2);
            assert( (boolean) eq2.invokeExact(new Object[]{ "me", "me" }));
            assert(!(boolean) eq2.invokeExact(new Object[]{ "me", "thee" }));
            // try to spread from anything but a 2-array:
            for (int n = 0; n <= 10; n++) {
              Object[] badArityArgs = (n == 2 ? new Object[0] : new Object[n]);
              try { assert((boolean) eq2.invokeExact(badArityArgs) && false); }
              catch (IllegalArgumentException ex) { } // OK
            }
            // spread both arguments from a String array:
            MethodHandle eq2s = equals.asSpreader(String[].class, 2);
            assert( (boolean) eq2s.invokeExact(new String[]{ "me", "me" }));
            assert(!(boolean) eq2s.invokeExact(new String[]{ "me", "thee" }));
            // spread second arguments from a 1-array:
            MethodHandle eq1 = equals.asSpreader(Object[].class, 1);
            assert( (boolean) eq1.invokeExact("me", new Object[]{ "me" }));
            assert(!(boolean) eq1.invokeExact("me", new Object[]{ "thee" }));
            // spread no arguments from a 0-array or null:
            MethodHandle eq0 = equals.asSpreader(Object[].class, 0);
            assert( (boolean) eq0.invokeExact("me", (Object)"me", new Object[0]));
            assert(!(boolean) eq0.invokeExact("me", (Object)"thee", (Object[])null));
            // asSpreader and asCollector are approximate inverses:
            for (int n = 0; n <= 2; n++) {
                for (Class<?> a : new Class<?>[]{Object[].class, String[].class, CharSequence[].class}) {
                    MethodHandle equals2 = equals.asSpreader(a, n).asCollector(a, n);
                    assert( (boolean) equals2.invokeWithArguments("me", "me"));
                    assert(!(boolean) equals2.invokeWithArguments("me", "thee"));
                }
            }
            MethodHandle caToString = publicLookup()
              .findStatic(Arrays.class, "toString", methodType(String.class, char[].class));
            assertEquals("[A, B, C]", (String) caToString.invokeExact("ABC".toCharArray()));
            MethodHandle caString3 = caToString.asCollector(char[].class, 3);
            assertEquals("[A, B, C]", (String) caString3.invokeExact('A', 'B', 'C'));
            MethodHandle caToString2 = caString3.asSpreader(char[].class, 2);
            assertEquals("[A, B, C]", (String) caToString2.invokeExact('A', "BC".toCharArray()));
            }

</blockquote>

java.lang.invoke.MethodHandle.asSpreader(java.lang.Class<?>, int)Java 檔。

此頁面的部分是根據 Android 開放原始碼專案所建立和共用的工作進行修改,並根據 Creative Commons 2.5 屬性授權中所述的詞彙使用。

適用於

AsSpreader(Int32, Class, Int32)

<讓em>陣列傳播</em>方法句柄接受位於指定位置的陣列自變數,並將其專案分散為位置自變數來取代數位。

[Android.Runtime.Register("asSpreader", "(ILjava/lang/Class;I)Ljava/lang/invoke/MethodHandle;", "GetAsSpreader_ILjava_lang_Class_IHandler", ApiSince=33)]
public virtual Java.Lang.Invoke.MethodHandle? AsSpreader (int spreadArgPos, Java.Lang.Class? arrayType, int arrayLength);
[<Android.Runtime.Register("asSpreader", "(ILjava/lang/Class;I)Ljava/lang/invoke/MethodHandle;", "GetAsSpreader_ILjava_lang_Class_IHandler", ApiSince=33)>]
abstract member AsSpreader : int * Java.Lang.Class * int -> Java.Lang.Invoke.MethodHandle
override this.AsSpreader : int * Java.Lang.Class * int -> Java.Lang.Invoke.MethodHandle

參數

spreadArgPos
Int32

自變數清單中的位置(以零起始的索引),其中應該開始散佈。

arrayType
Class

通常 Object[],要從中擷取散佈自變數的陣列自變數類型

arrayLength
Int32

要從傳入陣列自變數散佈的自變數數目

傳回

在呼叫原始方法句柄之前,新的方法句柄會在指定位置散佈陣列自變數

屬性

備註

<讓em>陣列傳播</em>方法句柄接受位於指定位置的陣列自變數,並將其專案分散為位置自變數來取代數位。 新的方法句柄會隨著其 目標調整目前的方法句柄。 配接器的型別會與目標的類型相同,不同之處在於 arrayLength 目標型別的參數從以零起始的位置 spreadArgPos開始,會由類型的 arrayType單一數位參數取代。

這個方法的行為非常類似 #asSpreader(Class, int),但接受額外的 spreadArgPos 自變數,以指出應該在參數清單中的位置進行散佈。

已在 9 中新增。

java.lang.invoke.MethodHandle.asSpreader(int, java.lang.Class<?>, int)Java 檔。

此頁面的部分是根據 Android 開放原始碼專案所建立和共用的工作進行修改,並根據 Creative Commons 2.5 屬性授權中所述的詞彙使用。

適用於