ServiceLoader Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Struttura per caricare le implementazioni di un servizio.
[Android.Runtime.Register("java/util/ServiceLoader", DoNotGenerateAcw=true)]
[Java.Interop.JavaTypeParameters(new System.String[] { "S" })]
public sealed class ServiceLoader : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, 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
- Ereditarietà
- Attributi
- Implementazioni
Commenti
Struttura per caricare le implementazioni di un servizio.
Un servizio è un'interfaccia o una classe nota per cui esistono zero, uno o molti provider di servizi. Un provider di servizi (o solo provider) è una classe che implementa o sottoclassi l'interfaccia o la classe nota. Un ServiceLoader oggetto è un oggetto che individua e carica i provider di servizi distribuiti nell'ambiente di runtime alla volta della scelta di un'applicazione. Il codice dell'applicazione si riferisce solo al servizio, non ai provider di servizi e si presuppone che sia in grado di scegliere tra più provider di servizi (in base alle funzionalità esposte tramite il servizio) e di gestire la possibilità che non si trovino provider di servizi.
<h2> Recupero di un caricatore <del servizio /h2>
Un'applicazione ottiene un caricatore del servizio per un determinato servizio richiamando uno dei metodi statici load di ServiceLoader.
<--Se l'applicazione è un modulo, la dichiarazione del modulo deve avere una direttiva uses che specifica il servizio; in questo modo è possibile individuare i provider e assicurarsi che vengano eseguiti in modo affidabile. Inoltre, se il modulo dell'applicazione non contiene il servizio, la dichiarazione del modulo deve avere una direttiva requires che specifica il modulo che esporta il servizio. È consigliabile che il modulo dell'applicazione non <><> richieda moduli che contengono provider del servizio.--/>
Un caricatore di servizi può essere usato per individuare e creare un'istanza dei provider del servizio tramite il #iterator() iterator metodo .
ServiceLoader definisce anche il #stream() stream metodo per ottenere un flusso di provider che possono essere ispezionati e filtrati senza crearne un'istanza.
Si supponga, ad esempio, che il servizio sia com.example.CodecFactory, un'interfaccia che definisce i metodi per la produzione di codificatori e decodificatori:
{@code
package com.example;
public interface CodecFactory {
Encoder getEncoder(String encodingName);
Decoder getDecoder(String encodingName);
}
}
Il codice seguente ottiene un caricatore del servizio per il CodecFactory servizio, quindi usa il relativo iteratore (creato automaticamente dal ciclo enhanced-for) per restituire istanze dei provider di servizi che si trovano:
{@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;
}
}
A volte un'applicazione può voler controllare un provider di servizi prima di crearne un'istanza, per determinare se un'istanza del provider di servizi sarebbe utile. Ad esempio, un provider di servizi in CodecFactory grado di produrre un codificatore "PNG" può essere annotato con @PNG. Il codice seguente usa il metodo del caricatore del stream servizio per produrre istanze di a differenza del Provider<CodecFactory> modo in cui l'iteratore produce istanze di 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 Un flusso di < oggetti >/liProvider<CodecFactory><>< restituisce un>p.type() /liClass<CodecFactory><li>< restituisce un'istanza di >get()/liCodecFactory</ol><>
<h2> Progettazione di servizi </h2>
Un servizio è un singolo tipo, in genere un'interfaccia o una classe astratta. È possibile usare una classe concreta, ma questa operazione non è consigliata. Il tipo può avere qualsiasi accessibilità. I metodi di un servizio sono altamente specifici del dominio, quindi questa specifica dell'API non può fornire consigli concreti sulla loro forma o funzione. Esistono tuttavia due linee guida generali: <ol><li>
Un servizio deve dichiarare tutti i metodi necessari per consentire ai provider di servizi di comunicare le proprietà specifiche del dominio e altri fattori di qualità dell'implementazione. Un'applicazione che ottiene un caricatore del servizio per il servizio può quindi richiamare questi metodi in ogni istanza di un provider di servizi, per scegliere il provider migliore per l'applicazione.
</li li><>
Un servizio deve esprimere se i provider di servizi devono essere implementazioni dirette del servizio o un meccanismo di riferimento indiretto, ad esempio un "proxy" o una "factory". I provider di servizi tendono a essere meccanismi di riferimento indiretto quando gli oggetti specifici del dominio sono relativamente costosi da creare; in questo caso, il servizio deve essere progettato in modo che i provider di servizi siano astrazioni che creano l'implementazione "reale" su richiesta. Ad esempio, il CodecFactory servizio esprime attraverso il nome che i provider di servizi sono factory per codec, anziché codec stessi, perché può essere costoso o complicato produrre determinati codec.
</li></ol>
<h2> "developing-service-providers">Sviluppo di provider di servizi</h2>
Un provider di servizi è un singolo tipo, in genere una classe concreta. È consentita un'interfaccia o una classe astratta perché può dichiarare un metodo del provider statico, descritto più avanti. Il tipo deve essere pubblico e non deve essere una classe interna.
Un provider di servizi e il relativo codice di supporto possono essere sviluppati in un modulo, che viene quindi distribuito nel percorso del modulo dell'applicazione o in un'immagine modulare. In alternativa, un provider di servizi e il relativo codice di supporto possono essere inseriti in un pacchetto come file JAR e distribuiti nel percorso della classe dell'applicazione. Il vantaggio dello sviluppo di un provider di servizi in un modulo è che il provider può essere completamente incapsulato per nascondere tutti i dettagli dell'implementazione.
Un'applicazione che ottiene un caricatore del servizio per un determinato servizio è indifferente al fatto che i provider del servizio vengano distribuiti in moduli o inseriti in un pacchetto come file JAR. L'applicazione crea un'istanza dei provider di servizi tramite l'iteratore del servizio o tramite Provider Provider oggetti nel flusso del caricatore del servizio, senza conoscere le posizioni dei provider di servizi.
<h2> Distribuzione dei provider di servizi nel percorso <della classe /h2>
Un provider di servizi incluso nel pacchetto come file JAR per il percorso della classe viene identificato inserendo un file di configurazione del provider nella directory META-INF/servicesdelle risorse . Il nome del file di configurazione del provider è il nome binario completo del servizio. Il file di configurazione del provider contiene un elenco di nomi binari completi dei provider di servizi, uno per riga.
Si supponga, ad esempio, che il provider di com.example.impl.StandardCodecs servizi sia incluso in un file JAR per il percorso della classe. Il file JAR conterrà un file di configurazione del provider denominato:
<blockquote/blockquote>META-INF/services/com.example.CodecFactory<>
contenente la riga:
<blockquote/blockquote>com.example.impl.StandardCodecs # Standard codecs<>
"format">Il file di configurazione del provider deve essere codificato in UTF-8. Gli spazi e i caratteri di tabulazione che circondano il nome di ogni provider di servizi, nonché le righe vuote, vengono ignorati. Il carattere di commento è '#' (U+0023<span style="font-size:smaller;">NUMBER SIGN</span>); in ogni riga tutti i caratteri che seguono il primo carattere di commento vengono ignorati. Se un nome di classe del provider di servizi è elencato più volte in un file di configurazione del provider, il duplicato viene ignorato. Se una classe del provider di servizi è denominata in più file di configurazione, il duplicato viene ignorato.
Un provider di servizi menzionato in un file di configurazione del provider può trovarsi nello stesso file JAR del file di configurazione del provider o in un file JAR diverso. Il provider di servizi deve essere visibile dal caricatore di classe inizialmente sottoposto a query per individuare il file di configurazione del provider; questo non è necessariamente il caricatore di classe che in definitiva individua il file di configurazione del provider.
<h2> Intervallo dell'individuazione <del provider /h2>
I provider di servizi vengono caricati e di cui viene creata un'istanza in modo differitore, ovvero su richiesta. Un caricatore di servizi gestisce una cache dei provider caricati finora. Ogni chiamata del iterator metodo restituisce un oggetto Iterator che restituisce prima tutti gli elementi memorizzati nella cache dall'iterazione precedente, nell'ordine di creazione di istanze e quindi individua e crea un'istanza di tutti i provider rimanenti, aggiungendo ognuno alla cache a sua volta. Analogamente, ogni chiamata del metodo di flusso restituisce un Stream oggetto che elabora prima tutti i provider caricati dalle operazioni di flusso precedenti, nell'ordine di carico e quindi individua in modo differitivo eventuali provider rimanenti. Le cache vengono cancellate tramite il #reload reload metodo .
<h2> "errors">Errors</h2>
Quando si usa il caricatore del iteratorservizio , i Iterator#hasNext() hasNext metodi e Iterator#next() next avranno esito negativo se ServiceConfigurationError si verifica un errore durante l'individuazione, il caricamento o l'istanza di un provider di servizi. Quando si elabora il flusso del caricatore del servizio, ServiceConfigurationError è possibile che venga generata da qualsiasi metodo che causa la posizione o il caricamento di un provider di servizi.
Quando si carica o crea un'istanza di un provider di servizi in un modulo, ServiceConfigurationError è possibile generare un'eccezione per i motivi seguenti:
Quando si legge un file di configurazione del provider o si carica o si crea un'istanza di una classe provider denominata in un file di configurazione del provider, è ServiceConfigurationError possibile generare un'eccezione per i motivi seguenti:
<ul>
<li> Il formato del file di configurazione del provider viola il formato specificato in precedenza; </li>
<li> An IOException IOException si verifica durante la lettura del file di configurazione del provider; </li>
<li> Un provider di servizi non può essere caricato; </li>
<li> Un provider di servizi non è assegnabile all'interfaccia o alla classe del servizio o non definisce un costruttore del provider o non può essere creata un'istanza. </li>
</ul>
<h2> Concorrenza </h2>
Le istanze di questa classe non sono sicure per l'uso da parte di più thread simultanei.
<h3> Gestione <null /h3>
Se non diversamente specificato, il passaggio di un null argomento a qualsiasi metodo in questa classe genererà un'eccezione NullPointerException .
Aggiunta nella versione 1.6.
Le parti di questa pagina sono modifiche basate sul lavoro creato e condiviso dalla e usati in base ai termini descritti in Creative License 2.5 Attribution License.
Proprietà
| Nome | Descrizione |
|---|---|
| Class |
Restituisce la classe di runtime di questo |
| Handle |
Handle per l'istanza di Android sottostante. (Ereditato da Object) |
| JniIdentityHashCode |
Ottiene il codice hash di identità assegnato a questo Java peer dal runtime di interoperabilità. (Ereditato da Object) |
| JniPeerMembers |
Struttura per caricare le implementazioni di un servizio. |
| PeerReference |
Ottiene il riferimento all'oggetto JNI per questo peer Java. (Ereditato da Object) |
| ThresholdClass |
Questa API supporta l'infrastruttura Mono per Android e non deve essere usata direttamente dal codice. (Ereditato da Object) |
| ThresholdType |
Questa API supporta l'infrastruttura Mono per Android e non deve essere usata direttamente dal codice. (Ereditato da Object) |
Metodi
| Nome | Descrizione |
|---|---|
| Clone() |
Crea e restituisce una copia di questo oggetto. (Ereditato da Object) |
| Dispose() |
Rilascia le risorse contenute in questo peer Java. (Ereditato da Object) |
| Dispose(Boolean) |
Rilascia le risorse contenute in questo peer Java. (Ereditato da Object) |
| Equals(Object) |
Indica se un altro oggetto è "uguale a" questo. (Ereditato da Object) |
| FindFirst() |
Caricare il primo provider di servizi disponibile del servizio del caricatore. |
| GetHashCode() |
Restituisce un valore di codice hash per l'oggetto . (Ereditato da Object) |
| Iterator() |
Carica in modo differinte i provider disponibili del servizio del caricatore. |
| JavaFinalize() |
Chiamato dal Garbage Collector su un oggetto quando Garbage Collection determina che non sono presenti altri riferimenti all'oggetto . (Ereditato da Object) |
| Load(Class, ClassLoader) |
Crea un nuovo caricatore del servizio per il tipo di servizio e il caricatore di classe specificati. |
| Load(Class) |
Crea un nuovo caricatore del servizio per il tipo di servizio specificato, usando java del thread corrente. |
| LoadInstalled(Class) |
Crea un nuovo caricatore del servizio per il tipo di servizio specificato, usando il caricatore della classe di estensione. |
| Notify() |
Riattiva un singolo thread in attesa del monitor dell'oggetto. (Ereditato da Object) |
| NotifyAll() |
Riattiva tutti i thread in attesa del monitor dell'oggetto. (Ereditato da Object) |
| Reload() |
Cancellare la cache del provider del caricatore in modo che tutti i provider vengano ricaricati. |
| SetHandle(IntPtr, JniHandleOwnership) |
Imposta la proprietà Handle. (Ereditato da Object) |
| ToArray<T>() |
Crea una matrice gestita da questo wrapper di matrice Java. (Ereditato da Object) |
| ToString() |
Restituisce una rappresentazione di stringa dell'oggetto . (Ereditato da Object) |
| UnregisterFromRuntime() |
Annulla la registrazione di questo Java peer dal runtime di interoperabilità. (Ereditato da Object) |
| Wait() |
Fa sì che il thread corrente attenda finché non viene risvegliato, in genere ricevendo <>una notifica</em> o <em>interrotto</em>. (Ereditato da Object) |
| Wait(Int64, Int32) |
Fa sì che il thread corrente attenda finché non viene risvegliato, in genere ricevendo<> una notifica</em> o <em>interrotto</em> o fino a quando non è trascorsa una determinata quantità di tempo reale. (Ereditato da Object) |
| Wait(Int64) |
Fa sì che il thread corrente attenda finché non viene risvegliato, in genere ricevendo<> una notifica</em> o <em>interrotto</em> o fino a quando non è trascorsa una determinata quantità di tempo reale. (Ereditato da Object) |
Implementazioni dell'interfaccia esplicita
| Nome | Descrizione |
|---|---|
| IJavaPeerable.Disposed() |
Notifica al runtime di interoperabilità che il peer gestito è stato eliminato. (Ereditato da Object) |
| IJavaPeerable.DisposeUnlessReferenced() |
Rilascia questo Java peer a meno che non venga conservato da un altro riferimento gestito. (Ereditato da Object) |
| IJavaPeerable.Finalized() |
Notifica al runtime di interoperabilità che il peer gestito è stato finalizzato. (Ereditato da Object) |
| IJavaPeerable.JniManagedPeerState |
Ottiene lo stato che descrive la relazione tra questo peer gestito e il relativo riferimento JNI. (Ereditato da Object) |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
Imposta il codice hash dell'identità di interoperabilità per questo Java peer. (Ereditato da Object) |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Imposta lo stato peer gestito e JNI per questo peer Java. (Ereditato da Object) |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
Imposta il riferimento all'oggetto JNI usato da questo peer gestito. (Ereditato da Object) |
Metodi di estensione
| Nome | Descrizione |
|---|---|
| GetJniTypeName(IJavaPeerable) |
Ottiene il nome JNI del tipo dell'istanza |
| JavaAs<TResult>(IJavaPeerable) |
Provare a digitare |
| JavaCast<TResult>(IJavaObject) |
Esegue una conversione del tipo di tipo controllato dal runtime Android. |
| JavaCast<TResult>(IJavaObject) |
Struttura per caricare le implementazioni di un servizio. |
| ToEnumerable(IIterable) |
Struttura per caricare le implementazioni di un servizio. |
| ToEnumerable<T>(IIterable) |
Struttura per caricare le implementazioni di un servizio. |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
Provare a digitare |