MethodHandle.AsSpreader Metode
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Overload
| AsSpreader(Class, Int32) |
<>Membuat handel metode array-spreading</em>, yang menerima argumen array berikutnya dan menyebarkan elemennya sebagai argumen posisi. |
| AsSpreader(Int32, Class, Int32) |
<>Membuat handel metode array-spreading</em>, yang menerima argumen array pada posisi tertentu dan menyebarkan elemennya sebagai argumen posisi sebagai pengganti array. |
AsSpreader(Class, Int32)
<>Membuat handel metode array-spreading</em>, yang menerima argumen array berikutnya dan menyebarkan elemennya sebagai argumen posisi.
[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
biasanya Object[], jenis argumen array untuk mengekstrak argumen spread
- arrayLength
- Int32
jumlah argumen yang akan disebarkan dari argumen array masuk
Mengembalikan
handel metode baru yang menyebarkan argumen array akhirnya, sebelum memanggil handel metode asli
- Atribut
Keterangan
<>Membuat handel metode array-spreading</em>, yang menerima argumen array berikutnya dan menyebarkan elemennya sebagai argumen posisi. Handel metode baru beradaptasi, sebagai targetnya, handel metode saat ini. Jenis adaptor akan sama dengan jenis target, kecuali bahwa parameter akhir arrayLength dari jenis target digantikan oleh parameter array tunggal jenis arrayType.
Jika jenis elemen array berbeda dari salah satu jenis argumen yang sesuai pada target asli, target asli diadaptasi untuk mengambil elemen array secara langsung, seolah-olah dengan panggilan ke #asType asType.
Ketika dipanggil, adaptor menggantikan argumen array berikutnya oleh elemen array, masing-masing sebagai argumennya sendiri ke target. (Urutan argumen dipertahankan.) Mereka dikonversi secara berpasangan dengan mentransmisikan dan/atau membuka kotak ke jenis parameter berikutnya dari target. Akhirnya target dipanggil. Apa yang akhirnya dikembalikan target tidak berubah oleh adaptor.
Sebelum memanggil target, adaptor memverifikasi bahwa array berisi elemen yang tepat untuk memberikan jumlah argumen yang benar ke handel metode target. (Array mungkin juga null ketika elemen nol diperlukan.)
Ketika adaptor dipanggil, panjang argumen yang disediakan array dikueri seolah-olah oleh array.length atau arraylength bytecode. Jika adaptor menerima argumen array trailing panjang nol, argumen yang disediakan array dapat berupa array panjang nol atau null; jika tidak, adaptor akan melemparkan NullPointerException jika array adalah null dan melemparkan IllegalArgumentException jika array tidak memiliki jumlah elemen yang benar.
Berikut adalah beberapa contoh sederhana handel metode penyebaran array: <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>
Dokumentasi Java untuk java.lang.invoke.MethodHandle.asSpreader(java.lang.Class<?>, int).
Bagian halaman ini adalah modifikasi berdasarkan pekerjaan yang dibuat dan dibagikan oleh Proyek Sumber Terbuka Android dan digunakan sesuai dengan istilah yang dijelaskan dalam Lisensi Atribusi Creative Commons 2.5.
Berlaku untuk
AsSpreader(Int32, Class, Int32)
<>Membuat handel metode array-spreading</em>, yang menerima argumen array pada posisi tertentu dan menyebarkan elemennya sebagai argumen posisi sebagai pengganti array.
[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
posisi (indeks berbasis nol) dalam daftar argumen di mana penyebaran harus dimulai.
- arrayType
- Class
biasanya Object[], jenis argumen array untuk mengekstrak argumen spread
- arrayLength
- Int32
jumlah argumen yang akan disebarkan dari argumen array masuk
Mengembalikan
handel metode baru yang menyebarkan argumen array pada posisi tertentu, sebelum memanggil handel metode asli
- Atribut
Keterangan
<>Membuat handel metode array-spreading</em>, yang menerima argumen array pada posisi tertentu dan menyebarkan elemennya sebagai argumen posisi sebagai pengganti array. Handel metode baru beradaptasi, sebagai targetnya, handel metode saat ini. Jenis adaptor akan sama dengan jenis target, kecuali bahwa arrayLength parameter jenis target, dimulai pada posisi spreadArgPosberbasis nol , digantikan oleh parameter array tunggal jenis arrayType.
Metode ini berulah sangat seperti #asSpreader(Class, int), tetapi menerima argumen tambahan spreadArgPos untuk menunjukkan posisi mana dalam daftar parameter yang harus dilakukan penyebaran.
Ditambahkan dalam 9.
Dokumentasi Java untuk java.lang.invoke.MethodHandle.asSpreader(int, java.lang.Class<?>, int).
Bagian halaman ini adalah modifikasi berdasarkan pekerjaan yang dibuat dan dibagikan oleh Proyek Sumber Terbuka Android dan digunakan sesuai dengan istilah yang dijelaskan dalam Lisensi Atribusi Creative Commons 2.5.