Поделиться через


MethodHandle.AsSpreader Метод

Определение

Перегрузки

AsSpreader(Class, Int32)

Делает дескриптор метода em-spread></em>, который принимает конечный <аргумент массива и распространяет его элементы в виде позиционных аргументов.

AsSpreader(Int32, Class, Int32)

<Делает дескриптор метода em-spread></em>, который принимает аргумент массива в заданной позиции и распространяет его элементы в качестве позиционных аргументов вместо массива.

AsSpreader(Class, Int32)

Делает дескриптор метода em-spread></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-spread></em>, который принимает конечный <аргумент массива и распространяет его элементы в виде позиционных аргументов. Новый дескриптор метода адаптируется в качестве целевого объекта, текущий дескриптор метода. Тип адаптера будет совпадать с типом целевого объекта, за исключением того, что окончательные arrayLength параметры типа целевого объекта заменяются одним параметром массива типа arrayType.

Если тип элемента массива отличается от любого из соответствующих типов аргументов в исходном целевом объекте, исходный целевой объект адаптирован для непосредственного принятия элементов массива, как если бы вызовом #asType asType.

При вызове адаптер заменяет конечный аргумент массива элементами массива, каждый из которых является собственным аргументом целевого объекта. (Порядок аргументов сохраняется.) Они преобразуются попарно путем приведения и (или) распаковки в типы конечных параметров целевого объекта. Наконец, вызывается целевой объект. То, что целевой объект в конечном итоге возвращается без изменений адаптером.

Перед вызовом целевого объекта адаптер проверяет, содержит ли массив достаточно элементов, чтобы предоставить правильное число аргументов дескриптору целевого метода. (Массив также может иметь значение NULL, если требуются нулевые элементы.)

При вызове адаптера длина предоставленного array аргумента запрашивается как по array.length байтовой коду.arraylength Если адаптер принимает аргумент конечного массива нулевой длины, указанный array аргумент может быть массивом нулевой длины или null; в противном случае адаптер вызовет NullPointerException исключение, если массив имеет null и создает 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 для java.lang.invoke.MethodHandle.asSpreader(java.lang.Class<?>, int).

Части этой страницы — это изменения на основе работы, созданной и общей проектом с открытым исходным кодом Android и используемой в соответствии с условиями, описанными в лицензии Creative Commons 2.5 Attribution.

Применяется к

AsSpreader(Int32, Class, Int32)

<Делает дескриптор метода em-spread></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-spread></em>, который принимает аргумент массива в заданной позиции и распространяет его элементы в качестве позиционных аргументов вместо массива. Новый дескриптор метода адаптируется в качестве целевого объекта, текущий дескриптор метода. Тип адаптера будет совпадать с типом целевого объекта, за исключением того, что arrayLength параметры типа целевого объекта, начиная spreadArgPosс нуля, заменяются одним параметром массива типа arrayType.

Этот метод работает очень так #asSpreader(Class, int)же, как, но принимает дополнительный spreadArgPos аргумент, чтобы указать, в какой позиции в списке параметров должно происходить распространение.

Добавлено в 9.

Документация по Java для java.lang.invoke.MethodHandle.asSpreader(int, java.lang.Class<?>, int).

Части этой страницы — это изменения на основе работы, созданной и общей проектом с открытым исходным кодом Android и используемой в соответствии с условиями, описанными в лицензии Creative Commons 2.5 Attribution.

Применяется к