Freigeben über


MethodHandle.AsSpreader Methode

Definition

Überlädt

AsSpreader(Class, Int32)

Macht einen <Em-Array-Spread></em-Methodenhandle>, der ein nachfolgendes Arrayargument akzeptiert und seine Elemente als Positionsargumente verteilt.

AsSpreader(Int32, Class, Int32)

Macht einen <Em>Array-Spread</Em-Methodenziehpunkt> , der ein Arrayargument an einer bestimmten Position akzeptiert und seine Elemente als Positionsargumente anstelle des Arrays verteilt.

AsSpreader(Class, Int32)

Macht einen <Em-Array-Spread></em-Methodenhandle>, der ein nachfolgendes Arrayargument akzeptiert und seine Elemente als Positionsargumente verteilt.

[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

Parameter

arrayType
Class

in der Regel Object[]der Typ des Arrayarguments, aus dem die Spread-Argumente extrahiert werden sollen

arrayLength
Int32

Die Anzahl der Argumente, die aus einem eingehenden Arrayargument verteilt werden sollen

Gibt zurück

ein neues Methodenhandle, das sein endgültiges Arrayargument verteilt, bevor der ursprüngliche Methodenhandle aufgerufen wird

Attribute

Hinweise

Macht einen <Em-Array-Spread></em-Methodenhandle>, der ein nachfolgendes Arrayargument akzeptiert und seine Elemente als Positionsargumente verteilt. Das neue Methodenhandle passt sich als Ziel an den aktuellen Methodenhandle an. Der Typ des Adapters entspricht dem Typ des Ziels, mit der Ausnahme, dass die endgültigen arrayLength Parameter des Zieltyps durch einen einzelnen Arrayparameter des Typs arrayTypeersetzt werden.

Wenn sich der Arrayelementtyp von einem der entsprechenden Argumenttypen im ursprünglichen Ziel unterscheidet, wird das ursprüngliche Ziel so angepasst, dass die Arrayelemente direkt übernommen werden, als ob durch einen Aufruf von #asType asType.

Wenn der Adapter aufgerufen wird, ersetzt der Adapter ein nachfolgendes Arrayargument durch die Elemente des Arrays, jedes als eigenes Argument für das Ziel. (Die Reihenfolge der Argumente wird beibehalten.) Sie werden gekoppelt durch Umwandlung und/oder Entboxung in die Typen der nachfolgenden Parameter des Ziels konvertiert. Schließlich wird das Ziel aufgerufen. Was das Ziel schließlich zurückgibt, wird vom Adapter unverändert zurückgegeben.

Vor dem Aufrufen des Ziels überprüft der Adapter, dass das Array genau genug Elemente enthält, um dem Zielmethodenhandle eine korrekte Argumentanzahl bereitzustellen. (Das Array kann auch null sein, wenn Nullelemente erforderlich sind.)

Wenn der Adapter aufgerufen wird, wird die Länge des angegebenen array Arguments abgefragt, als ob durch oder arraylength bytecodearray.length. Wenn der Adapter ein array-Argument der Länge Null akzeptiert, kann das angegebene array Argument entweder ein Array der Länge Null oder null; andernfalls löst der Adapter ein NullPointerException , wenn das Array vorhanden ist null , und löst ein IllegalArgumentException , wenn das Array nicht über die richtige Anzahl von Elementen verfügt.

Hier sind einige einfache Beispiele für Arrayverteilungsmethodenhandles: <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-Dokumentation für java.lang.invoke.MethodHandle.asSpreader(java.lang.Class<?>, int).

Teile dieser Seite sind Änderungen auf der Grundlage von Arbeiten, die vom Android Open Source-Projekt erstellt und freigegeben werden und gemäß den in der Creative Commons 2.5 Attribution License beschriebenen Begriffen verwendet werden.

Gilt für:

AsSpreader(Int32, Class, Int32)

Macht einen <Em>Array-Spread</Em-Methodenziehpunkt> , der ein Arrayargument an einer bestimmten Position akzeptiert und seine Elemente als Positionsargumente anstelle des Arrays verteilt.

[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

Parameter

spreadArgPos
Int32

die Position (nullbasierter Index) in der Argumentliste, an der die Verbreitung beginnen soll.

arrayType
Class

in der Regel Object[]der Typ des Arrayarguments, aus dem die Spread-Argumente extrahiert werden sollen

arrayLength
Int32

Die Anzahl der Argumente, die aus einem eingehenden Arrayargument verteilt werden sollen

Gibt zurück

ein neues Methodenhandle, das ein Arrayargument an einer bestimmten Position verteilt, bevor der ursprüngliche Methodenhandle aufgerufen wird

Attribute

Hinweise

Macht einen <Em>Array-Spread</Em-Methodenziehpunkt> , der ein Arrayargument an einer bestimmten Position akzeptiert und seine Elemente als Positionsargumente anstelle des Arrays verteilt. Das neue Methodenhandle passt sich als Ziel an den aktuellen Methodenhandle an. Der Typ des Adapters entspricht dem Typ des Ziels, mit der Ausnahme, dass die arrayLength Parameter des Zieltyps, beginnend mit der nullbasierten Position spreadArgPos, durch einen einzelnen Arrayparameter des Typs arrayTypeersetzt werden.

Diese Methode verhält sich sehr ähnlich #asSpreader(Class, int), akzeptiert aber ein zusätzliches spreadArgPos Argument, um anzugeben, an welcher Position in der Parameterliste die Verbreitung stattfinden soll.

Hinzugefügt in 9.

Java-Dokumentation für java.lang.invoke.MethodHandle.asSpreader(int, java.lang.Class<?>, int).

Teile dieser Seite sind Änderungen auf der Grundlage von Arbeiten, die vom Android Open Source-Projekt erstellt und freigegeben werden und gemäß den in der Creative Commons 2.5 Attribution License beschriebenen Begriffen verwendet werden.

Gilt für: