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.