ServiceLoader Kelas

Definisi

Fasilitas untuk memuat implementasi layanan.

[Android.Runtime.Register("java/util/ServiceLoader", DoNotGenerateAcw=true)]
[Java.Interop.JavaTypeParameters(new System.String[] { "S" })]
public sealed class ServiceLoader : Java.Lang.Object, IDisposable, Java.Lang.IIterable
[<Android.Runtime.Register("java/util/ServiceLoader", DoNotGenerateAcw=true)>]
[<Java.Interop.JavaTypeParameters(new System.String[] { "S" })>]
type ServiceLoader = class
    inherit Object
    interface IIterable
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
Warisan
ServiceLoader
Atribut
Penerapan

Keterangan

Fasilitas untuk memuat implementasi layanan.

Layanan adalah antarmuka atau kelas terkenal yang nol, satu, atau banyak penyedia layanan ada. Penyedia layanan (atau hanya penyedia) adalah kelas yang mengimplementasikan atau mensubkelas antarmuka atau kelas terkenal. adalah ServiceLoader objek yang menemukan dan memuat penyedia layanan yang disebarkan di lingkungan run time pada waktu yang dipilih aplikasi. Kode aplikasi hanya mengacu pada layanan, bukan ke penyedia layanan, dan diasumsikan mampu memilih antara beberapa penyedia layanan (berdasarkan fungsionalitas yang mereka ekspos melalui layanan), dan menangani kemungkinan bahwa tidak ada penyedia layanan yang berada.

<h2> Mendapatkan pemuat <layanan /h2>

Aplikasi mendapatkan pemuat layanan untuk layanan tertentu dengan memanggil salah satu metode statis load .ServiceLoader <--Jika aplikasi adalah modul, maka deklarasi modulnya harus memiliki direktif penggunaan yang menentukan layanan; ini membantu menemukan penyedia dan memastikan mereka akan dijalankan dengan andal. Selain itu, jika modul aplikasi tidak berisi layanan, maka deklarasi modulnya harus memiliki arahan yang memerlukan yang menentukan modul yang mengekspor layanan. Sangat disarankan agar modul aplikasi tidak <b>/<b> memerlukan modul yang berisi penyedia layanan.--/>

Pemuat layanan dapat digunakan untuk menemukan dan membuat instans penyedia layanan dengan metode #iterator() iterator . ServiceLoader juga mendefinisikan #stream() stream metode untuk mendapatkan aliran penyedia yang dapat diperiksa dan difilter tanpa membuat instansnya.

Sebagai contoh, misalkan layanan adalah com.example.CodecFactory, antarmuka yang mendefinisikan metode untuk memproduksi encoder dan decoder:

{@code
                package com.example;
                public interface CodecFactory {
                    Encoder getEncoder(String encodingName);
                    Decoder getDecoder(String encodingName);
                }
            }

Kode berikut mendapatkan pemuat layanan untuk CodecFactory layanan, lalu menggunakan iteratornya (dibuat secara otomatis oleh perulangan yang ditingkatkan-untuk) untuk menghasilkan instans penyedia layanan yang berada:

{@code
                ServiceLoader<CodecFactory> loader = ServiceLoader.load(CodecFactory.class);
                for (CodecFactory factory : loader) {
                    Encoder enc = factory.getEncoder("PNG");
                    if (enc != null)
                        ... use enc to encode a PNG file
                        break;
                    }
            }

Terkadang aplikasi mungkin ingin memeriksa penyedia layanan sebelum membuat instans, untuk menentukan apakah instans penyedia layanan tersebut akan berguna. Misalnya, penyedia layanan yang CodecFactory mampu menghasilkan encoder "PNG" dapat diannotasi dengan @PNG. Kode berikut menggunakan metode service loader stream untuk menghasilkan instans berbeda dengan Provider<CodecFactory> bagaimana iterator menghasilkan instans CodecFactory:

{@code
                ServiceLoader<CodecFactory> loader = ServiceLoader.load(CodecFactory.class);
                Set<CodecFactory> pngFactories = loader
                       .stream()                                              // Note a below
                       .filter(p -> p.type().isAnnotationPresent(PNG.class))  // Note b
                       .map(Provider::get)                                    // Note c
                       .collect(Collectors.toSet());
            }

<ol type="a">li Aliran objek /li li<>Provider<CodecFactory>< menghasilkan ></li li>p.type()Class<CodecFactory>< menghasilkan instans ></li>get()/ol CodecFactory<><>

<h2> Merancang layanan </h2>

Layanan adalah jenis tunggal, biasanya antarmuka atau kelas abstrak. Kelas konkret dapat digunakan, tetapi ini tidak disarankan. Jenisnya mungkin memiliki aksesibilitas apa pun. Metode layanan sangat spesifik domain, sehingga spesifikasi API ini tidak dapat memberikan saran konkret tentang bentuk atau fungsinya. Namun, ada dua panduan umum: <ol><li>

Layanan harus mendeklarasikan metode sebanyak yang diperlukan untuk memungkinkan penyedia layanan mengomunikasikan properti khusus domain mereka dan faktor kualitas implementasi lainnya. Aplikasi yang mendapatkan pemuat layanan untuk layanan kemudian dapat memanggil metode ini pada setiap instans penyedia layanan, untuk memilih penyedia terbaik untuk aplikasi.

</li><li>

Layanan harus mengekspresikan apakah penyedia layanannya dimaksudkan untuk menjadi implementasi langsung layanan atau menjadi mekanisme tidak langsung seperti "proksi" atau "pabrik". Penyedia layanan cenderung menjadi mekanisme tidak langsung ketika objek khusus domain relatif mahal untuk instans; dalam hal ini, layanan harus dirancang sehingga penyedia layanan adalah abstraksi yang menciptakan implementasi "nyata" sesuai permintaan. Misalnya, CodecFactory layanan mengekspresikan melalui namanya bahwa penyedia layanannya adalah pabrik untuk codec, daripada codec itu sendiri, karena mungkin mahal atau rumit untuk menghasilkan codec tertentu.

</li></ol>

<h2> "developing-service-providers">Mengembangkan penyedia< layanan/h2>

Penyedia layanan adalah satu jenis, biasanya kelas konkret. Antarmuka atau kelas abstrak diizinkan karena dapat mendeklarasikan metode penyedia statis, yang dibahas nanti. Jenisnya harus publik dan tidak boleh kelas dalam.

Penyedia layanan dan kode pendukungnya dapat dikembangkan dalam modul, yang kemudian disebarkan pada jalur modul aplikasi atau dalam gambar modular. Atau, penyedia layanan dan kode pendukungnya dapat dipaketkan sebagai file JAR dan disebarkan pada jalur kelas aplikasi. Keuntungan mengembangkan penyedia layanan dalam modul adalah bahwa penyedia dapat sepenuhnya dienkapsulasi untuk menyembunyikan semua detail implementasinya.

Aplikasi yang mendapatkan pemuat layanan untuk layanan tertentu tidak peduli apakah penyedia layanan disebarkan dalam modul atau dipaketkan sebagai file JAR. Aplikasi membuat instans penyedia layanan melalui iterator service loader, atau melalui Provider Provider objek dalam aliran service loader, tanpa mengetahui lokasi penyedia layanan.

<h2> Menyebarkan penyedia layanan pada jalur <kelas /h2>

Penyedia layanan yang di kemas sebagai file JAR untuk jalur kelas diidentifikasi dengan menempatkan file konfigurasi penyedia di direktori META-INF/servicessumber daya . Nama file konfigurasi penyedia adalah nama biner layanan yang sepenuhnya memenuhi syarat. File konfigurasi penyedia berisi daftar nama biner penyedia layanan yang sepenuhnya memenuhi syarat, satu per baris.

Misalnya, penyedia com.example.impl.StandardCodecs layanan dipaketkan dalam file JAR untuk jalur kelas. File JAR akan berisi file konfigurasi penyedia bernama:

<blockquote>META-INF/services/com.example.CodecFactory</blockquote>

yang berisi baris:

<blockquote>com.example.impl.StandardCodecs # Standard codecs</blockquote>

"format">File konfigurasi penyedia harus dikodekan dalam UTF-8. Karakter spasi dan tab yang mengelilingi setiap nama penyedia layanan, serta baris kosong, diabaikan. Karakter komentar adalah '#' (U+0023<span style="font-size:smaller;">NUMBER SIGN</span>); pada setiap baris semua karakter setelah karakter komentar pertama diabaikan. Jika nama kelas penyedia layanan tercantum lebih dari sekali dalam file konfigurasi penyedia, maka duplikat diabaikan. Jika kelas penyedia layanan diberi nama dalam lebih dari satu file konfigurasi, maka duplikat diabaikan.

Penyedia layanan yang disebutkan dalam file konfigurasi penyedia mungkin terletak di file JAR yang sama dengan file konfigurasi penyedia atau dalam file JAR yang berbeda. Penyedia layanan harus terlihat dari pemuat kelas yang awalnya dikueri untuk menemukan file konfigurasi penyedia; ini belum tentu pemuat kelas yang pada akhirnya menemukan file konfigurasi penyedia.

<h2> Waktu penemuan <penyedia /h2>

Penyedia layanan dimuat dan diinstansiasi dengan malas, yaitu sesuai permintaan. Pemuat layanan mempertahankan cache penyedia yang telah dimuat sejauh ini. Setiap pemanggilan iterator metode mengembalikan Iterator yang pertama menghasilkan semua elemen yang di-cache dari iterasi sebelumnya, dalam urutan instansiasi, dan kemudian dengan malas menemukan dan membuat instans penyedia yang tersisa, menambahkan masing-masing ke cache secara bergantian. Demikian pula, setiap pemanggilan metode stream mengembalikan Stream yang pertama kali memproses semua penyedia yang dimuat oleh operasi streaming sebelumnya, dalam urutan beban, dan kemudian dengan malas menemukan penyedia yang tersisa. Cache dibersihkan melalui #reload reload metode .

<h2> "errors">Errors</h2>

Saat menggunakan loader iteratorlayanan , Iterator#hasNext() hasNext metode dan Iterator#next() next akan gagal jika ServiceConfigurationError terjadi kesalahan menemukan, memuat, atau membuat instans penyedia layanan. Saat memproses aliran pemuat layanan, maka ServiceConfigurationError dapat dilemparkan oleh metode apa pun yang menyebabkan penyedia layanan berada atau dimuat.

Saat memuat atau membuat instans penyedia layanan dalam modul, ServiceConfigurationError dapat dilemparkan karena alasan berikut:

Saat membaca file konfigurasi penyedia, atau memuat atau membuat instans kelas penyedia bernama dalam file konfigurasi penyedia, maka ServiceConfigurationError dapat dilemparkan karena alasan berikut:

<ul>

<li> Format file konfigurasi penyedia melanggar format yang ditentukan di atas; </li>

<li> An IOException IOException terjadi saat membaca file konfigurasi penyedia; </li>

<penyedia layanan li> A tidak dapat dimuat; </li>

<li> Penyedia layanan tidak dapat ditetapkan ke antarmuka atau kelas layanan, atau tidak menentukan konstruktor penyedia, atau tidak dapat dibuat. </li>

</Ul>

<h2> Konkurensi </h2>

Instans kelas ini tidak aman untuk digunakan oleh beberapa utas bersamaan.

<h3> Penanganan <null /h3>

Kecuali ditentukan lain, meneruskan null argumen ke metode apa pun di kelas ini akan menyebabkan NullPointerException dilemparkan.

Ditambahkan dalam 1.6.

Java dokumentasi untuk java.util.ServiceLoader.

Bagian dari halaman ini adalah modifikasi berdasarkan pekerjaan yang dibuat dan dibagikan oleh Android Open Source Project dan digunakan sesuai dengan istilah yang dijelaskan dalam Lisensi Creative Commons 2.5 Lisensi Atribusi.

Properti

Nama Deskripsi
Class

Mengembalikan kelas runtime dari .Object

(Diperoleh dari Object)
Handle

Handel ke instans Android yang mendasar.

(Diperoleh dari Object)
JniIdentityHashCode

Mendapatkan kode hash identitas yang ditetapkan ke Java peer ini oleh runtime interop.

(Diperoleh dari Object)
JniManagedPeerState

Fasilitas untuk memuat implementasi layanan.

(Diperoleh dari JavaObject)
JniPeerMembers

Fasilitas untuk memuat implementasi layanan.

PeerReference

Mendapatkan referensi objek JNI untuk peer Java ini.

(Diperoleh dari Object)
ThresholdClass

API ini mendukung infrastruktur Mono untuk Android dan tidak dimaksudkan untuk digunakan langsung dari kode Anda.

(Diperoleh dari Object)
ThresholdType

API ini mendukung infrastruktur Mono untuk Android dan tidak dimaksudkan untuk digunakan langsung dari kode Anda.

(Diperoleh dari Object)

Metode

Nama Deskripsi
Clone()

Membuat dan mengembalikan salinan objek ini.

(Diperoleh dari Object)
Construct(JniObjectReference, JniObjectReferenceOptions)

Fasilitas untuk memuat implementasi layanan.

(Diperoleh dari JavaObject)
Dispose()

Merilis sumber daya yang dipegang oleh rekan Java ini.

(Diperoleh dari Object)
Dispose(Boolean)

Merilis sumber daya yang dipegang oleh rekan Java ini.

(Diperoleh dari Object)
DisposeUnlessReferenced()

Fasilitas untuk memuat implementasi layanan.

(Diperoleh dari JavaObject)
Equals(Object)

Fasilitas untuk memuat implementasi layanan.

(Diperoleh dari JavaObject)
Equals(Object)

Menunjukkan apakah beberapa objek lain "sama dengan" yang satu ini.

(Diperoleh dari Object)
FindFirst()

Muat penyedia layanan pertama yang tersedia dari layanan pemuat ini.

GetHashCode()

Mengembalikan nilai kode hash untuk objek .

(Diperoleh dari Object)
Iterator()

Lazily memuat penyedia yang tersedia dari layanan pemuat ini.

JavaFinalize()

Dipanggil oleh pengumpul sampah pada objek ketika pengumpulan sampah menentukan bahwa tidak ada lagi referensi ke objek.

(Diperoleh dari Object)
Load(Class, ClassLoader)

Membuat pemuat layanan baru untuk jenis layanan dan pemuat kelas yang diberikan.

Load(Class)

Membuat pemuat layanan baru untuk jenis layanan yang diberikan, menggunakan java utas saat ini.

LoadInstalled(Class)

Membuat pemuat layanan baru untuk jenis layanan yang diberikan, menggunakan loader kelas ekstensi.

Notify()

Membangunkan satu utas yang menunggu monitor objek ini.

(Diperoleh dari Object)
NotifyAll()

Membangunkan semua utas yang menunggu monitor objek ini.

(Diperoleh dari Object)
Reload()

Hapus cache penyedia loader ini sehingga semua penyedia akan dimuat ulang.

SetHandle(IntPtr, JniHandleOwnership)

Mengatur properti Handle.

(Diperoleh dari Object)
SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

Fasilitas untuk memuat implementasi layanan.

(Diperoleh dari JavaObject)
ToArray<T>()

Membuat array terkelola dari pembungkus array Java ini.

(Diperoleh dari Object)
ToString()

Mengembalikan representasi string objek.

(Diperoleh dari Object)
UnregisterFromRuntime()

Membatalkan pendaftaran peer Java ini dari runtime interop.

(Diperoleh dari Object)
Wait()

Menyebabkan utas saat ini menunggu sampai terbangun, biasanya dengan <diberitahu></em> atau <em>terganggu</em>.

(Diperoleh dari Object)
Wait(Int64, Int32)

Menyebabkan utas saat ini menunggu sampai terbangun, biasanya dengan <>diberitahu</em> atau <em>terganggu</em>, atau sampai sejumlah waktu nyata berlalu.

(Diperoleh dari Object)
Wait(Int64)

Menyebabkan utas saat ini menunggu sampai terbangun, biasanya dengan <>diberitahu</em> atau <em>terganggu</em>, atau sampai sejumlah waktu nyata berlalu.

(Diperoleh dari Object)

Implementasi Antarmuka Eksplisit

Nama Deskripsi
IJavaPeerable.Disposed()

Fasilitas untuk memuat implementasi layanan.

(Diperoleh dari JavaObject)
IJavaPeerable.Finalized()

Fasilitas untuk memuat implementasi layanan.

(Diperoleh dari JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

Fasilitas untuk memuat implementasi layanan.

(Diperoleh dari JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Fasilitas untuk memuat implementasi layanan.

(Diperoleh dari JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Fasilitas untuk memuat implementasi layanan.

(Diperoleh dari JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

Fasilitas untuk memuat implementasi layanan.

(Diperoleh dari JavaObject)
IJavaPeerable.UnregisterFromRuntime()

Fasilitas untuk memuat implementasi layanan.

Metode Ekstensi

Nama Deskripsi
GetJniTypeName(IJavaPeerable)

Mendapatkan nama JNI dari jenis instans self.

JavaAs<TResult>(IJavaPeerable)

Cobalah untuk memaksa self untuk mengetik TResult, memeriksa bahwa paksaan valid di sisi Java.

JavaCast<TResult>(IJavaObject)

Melakukan konversi jenis yang diperiksa runtime Android.

JavaCast<TResult>(IJavaObject)

Fasilitas untuk memuat implementasi layanan.

ToEnumerable(IIterable)

Fasilitas untuk memuat implementasi layanan.

ToEnumerable<T>(IIterable)

Fasilitas untuk memuat implementasi layanan.

TryJavaCast<TResult>(IJavaPeerable, TResult)

Cobalah untuk memaksa self untuk mengetik TResult, memeriksa bahwa paksaan valid di sisi Java.

Berlaku untuk