Sprache

ServiceLoader Klasse

Definition

Eine Einrichtung zum Laden von Implementierungen eines Dienstes.

[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
Vererbung
ServiceLoader
Attribute
Implementiert

Hinweise

Eine Einrichtung zum Laden von Implementierungen eines Dienstes.

Ein Dienst ist eine bekannte Schnittstelle oder Klasse, für die null, ein oder viele Dienstanbieter vorhanden sind. Ein Dienstanbieter (oder nur Anbieter) ist eine Klasse, die die bekannte Schnittstelle oder Klasse implementiert oder unterordnet. A ServiceLoader ist ein Objekt, das Dienstanbieter sucht und lädt, die in der Laufzeitumgebung zu einem Zeitpunkt der Auswahl einer Anwendung bereitgestellt werden. Anwendungscode bezieht sich nur auf den Dienst, nicht auf Dienstanbieter und wird davon ausgegangen, dass er in der Lage ist, zwischen mehreren Dienstanbietern (basierend auf der Funktionalität, die sie über den Dienst verfügbar machen) zu wählen und die Möglichkeit zu behandeln, dass sich keine Dienstanbieter befinden.

<h2> Abrufen eines Dienstladeprogramms </h2>

Eine Anwendung ruft ein Dienstladeprogramm für einen bestimmten Dienst ab, indem eine der statischen load Methoden von ServiceLoader. <--Wenn die Anwendung ein Modul ist, muss die Moduldeklaration über eine Verwendungsrichtlinie verfügen, die den Dienst angibt; dies hilft, Anbieter zu finden und sicherzustellen, dass sie zuverlässig ausgeführt werden. Wenn das Anwendungsmodul den Dienst nicht enthält, muss die Moduldeklaration über eine Richtlinie verfügen , die das Modul angibt, das den Dienst exportiert. Es wird dringend empfohlen, dass das Anwendungsmodul <keine><> Module erfordert, die Anbieter des Diensts enthalten.--/>

Ein Dienstladeprogramm kann verwendet werden, um Anbieter des Diensts mithilfe der #iterator() iterator Methode zu suchen und zu instanziieren. ServiceLoader definiert außerdem die #stream() stream Methode zum Abrufen eines Datenstroms von Anbietern, die überprüft und gefiltert werden können, ohne sie instanziieren zu müssen.

Angenommen, der Dienst ist com.example.CodecFactoryeine Schnittstelle, die Methoden für die Erstellung von Encodern und Decodern definiert:

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

Der folgende Code ruft ein Dienstladeprogramm für den CodecFactory Dienst ab und verwendet dann seinen Iterator (automatisch durch die erweiterte Schleife erstellt), um Instanzen der Dienstanbieter zu liefern, die sich befinden:

{@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;
                    }
            }

Manchmal möchte eine Anwendung einen Dienstanbieter vor der Instanziierung prüfen, um festzustellen, ob eine Instanz dieses Dienstanbieters nützlich wäre. Beispielsweise kann ein Dienstanbieter, für CodecFactory den ein PNG-Encoder erzeugt werden kann, mit @PNGAnmerkungen versehen werden. Der folgende Code verwendet die Methode des stream Dienstladeprogramms, um Instanzen von Provider<CodecFactory> im Gegensatz zur Art und Weise, wie der Iterator Instanzen von 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 A stream of < objects >/li li yieldsProvider<CodecFactory>< a ></li>p.type()liClass<CodecFactory><yields>< an instance of >get()/liCodecFactory</ol><>

<h2> Entwerfen von Diensten </h2>

Ein Dienst ist ein einzelner Typ, in der Regel eine Schnittstelle oder abstrakte Klasse. Eine konkrete Klasse kann verwendet werden, dies wird jedoch nicht empfohlen. Der Typ verfügt möglicherweise über Barrierefreiheit. Die Methoden eines Diensts sind hochgradig domänenspezifisch, sodass diese API-Spezifikation keine konkreten Ratschläge zu ihrer Form oder Funktion geben kann. Es gibt jedoch zwei allgemeine Richtlinien: <ol><li>

Ein Dienst sollte beliebig viele Methoden deklarieren, damit Dienstanbieter ihre domänenspezifischen Eigenschaften und andere Qualitätsfaktoren kommunizieren können. Eine Anwendung, die ein Dienstladeprogramm für den Dienst abruft, kann diese Methoden dann für jede Instanz eines Dienstanbieters aufrufen, um den besten Anbieter für die Anwendung auszuwählen.

</li li><>

Ein Dienst sollte ausdrücken, ob es sich bei seinen Dienstanbietern um direkte Implementierungen des Diensts oder um einen Dereferenzierungsmechanismus wie einen "Proxy" oder eine "Factory" handelt. Dienstanbieter neigen dazu, Dereferenzierungsmechanismen zu sein, wenn domänenspezifische Objekte relativ teuer zum Instanziieren sind; In diesem Fall sollte der Dienst so konzipiert werden, dass Dienstanbieter Abstraktionen sind, die die "echte" Implementierung bei Bedarf schaffen. Der Dienst drückt z. B. seinen Namen aus, CodecFactory dass es sich bei seinen Dienstanbietern um Fabriken für Codecs und nicht um Codecs selbst handelt, da es teuer oder kompliziert sein kann, bestimmte Codecs zu produzieren.

</li></ol>

<h2> "developing-service-providers">Developing service providers</h2>

Ein Dienstanbieter ist ein einzelner Typ, in der Regel eine konkrete Klasse. Eine Schnittstelle oder abstrakte Klasse ist zulässig, da sie eine statische Anbietermethode deklarieren kann, die später erläutert wird. Der Typ muss öffentlich sein und darf keine innere Klasse sein.

Ein Dienstanbieter und sein unterstützender Code können in einem Modul entwickelt werden, das dann auf dem Anwendungsmodulpfad oder in einem modularen Image bereitgestellt wird. Alternativ kann ein Dienstanbieter und sein unterstützender Code als JAR-Datei verpackt und im Anwendungsklassenpfad bereitgestellt werden. Der Vorteil der Entwicklung eines Dienstanbieters in einem Modul besteht darin, dass der Anbieter vollständig gekapselt werden kann, um alle Details seiner Implementierung auszublenden.

Eine Anwendung, die ein Dienstladeprogramm für einen bestimmten Dienst abruft, ist gleichgültig, ob Anbieter des Diensts in Modulen bereitgestellt oder als JAR-Dateien verpackt werden. Die Anwendung instanziiert Dienstanbieter über den Iterator des Dienstladegeräts oder über Provider Provider Objekte im Datenstrom des Dienstladegeräts, ohne Kenntnis der Standorte des Dienstanbieters.

<h2> Bereitstellen von Dienstanbietern im Klassenpfad </h2>

Ein Dienstanbieter, der als JAR-Datei für den Klassenpfad verpackt ist, wird durch Platzieren einer Anbieterkonfigurationsdatei im Ressourcenverzeichnis META-INF/servicesidentifiziert. Der Name der Anbieterkonfigurationsdatei ist der vollqualifizierte binäre Name des Diensts. Die Anbieterkonfigurationsdatei enthält eine Liste der vollqualifizierten Binärnamen von Dienstanbietern, eine pro Zeile.

Angenommen, der Dienstanbieter com.example.impl.StandardCodecs wird in einer JAR-Datei für den Klassenpfad gepackt. Die JAR-Datei enthält eine Anbieterkonfigurationsdatei mit dem Namen:

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

enthält die Zeile:

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

"format">: Die Anbieterkonfigurationsdatei muss in UTF-8 codiert werden. Leerzeichen und Tabstoppzeichen, die den Namen jedes Dienstanbieters sowie leere Zeilen umgeben, werden ignoriert. Das Kommentarzeichen lautet '#' (U+0023<span style="font-size:smaller;">NUMMERNZEICHEN</Bereich>); in jeder Zeile werden alle Zeichen, die auf das erste Kommentarzeichen folgen, ignoriert. Wenn ein Dienstanbieter-Klassenname mehrmals in einer Anbieterkonfigurationsdatei aufgeführt wird, wird das Duplikat ignoriert. Wenn eine Dienstanbieterklasse in mehr als einer Konfigurationsdatei benannt ist, wird das Duplikat ignoriert.

Ein Dienstanbieter, der in einer Anbieterkonfigurationsdatei erwähnt wird, befindet sich möglicherweise in derselben JAR-Datei wie die Anbieterkonfigurationsdatei oder in einer anderen JAR-Datei. Der Dienstanbieter muss vom Klassenladeprogramm angezeigt werden, das zunächst abgefragt wird, um die Anbieterkonfigurationsdatei zu finden; Dies ist nicht unbedingt das Klassenladeprogramm, das letztendlich die Anbieterkonfigurationsdatei findet.

<h2> Anzeigedauer der Anbieterermittlung </h2>

Dienstanbieter werden lazily geladen und instanziiert, d. h. bei Bedarf. Ein Dienstladeprogramm verwaltet einen Cache der Anbieter, die bisher geladen wurden. Jeder Aufruf der iterator Methode gibt einen Iterator Wert zurück, der zuerst alle Elemente zurückgibt, die aus der vorherigen Iteration zwischengespeichert wurden, in Instanziierungsreihenfolge, und dann lazily sucht und instanziiert alle verbleibenden Anbieter und fügt jedes element wiederum dem Cache hinzu. Entsprechend gibt jeder Aufruf der Streammethode ein Stream , das zuerst alle von vorherigen Datenstromvorgängen geladenen Anbieter verarbeitet, in Der Ladereihenfolge und anschließend alle verbleibenden Anbieter lazily findet. Caches werden über die #reload reload Methode gelöscht.

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

Wenn sie das Dienstladeprogramm iteratorverwenden, schlägt Iterator#hasNext() hasNext die Iterator#next() next Methode fehlServiceConfigurationError, wenn beim Suchen, Laden oder Instanziieren eines Dienstanbieters ein Fehler auftritt. Wenn der Datenstrom ServiceConfigurationError des Dienstladegeräts verarbeitet wird, kann es von jeder Methode ausgelöst werden, die bewirkt, dass sich ein Dienstanbieter befindet oder geladen wird.

Beim Laden oder Instanziieren eines Dienstanbieters in einem Modul ServiceConfigurationError kann aus folgenden Gründen ausgelöst werden:

Beim Lesen einer Anbieterkonfigurationsdatei oder beim Laden oder Instanziieren einer Anbieterklasse, die in einer Anbieterkonfigurationsdatei benannt ist, kann dies ServiceConfigurationError aus den folgenden Gründen ausgelöst werden:

<Ul>

<li> Das Format der Anbieterkonfigurationsdatei verstößt gegen das oben angegebene Format; </li>

<li> An IOException IOException tritt beim Lesen der Anbieterkonfigurationsdatei auf; </li>

<li> A Service Provider kann nicht geladen werden; </li>

<li> A service provider is not assignable to the service's interface or class, or does not define a provider constructor, or cannot be instantiated. </li>

</ul>

<h2> Parallelität </h2>

Instanzen dieser Klasse sind nicht sicher für die Verwendung durch mehrere gleichzeitige Threads.

<h3> Null-Behandlung </h3>

Sofern nicht anders angegeben, wird das Übergeben eines null Arguments an eine beliebige Methode in dieser Klasse dazu führen, dass ein NullPointerException Fehler ausgelöst wird.

In 1.6 hinzugefügt.

Java Dokumentation für java.util.ServiceLoader.

Teile dieser Seite sind Änderungen auf der Grundlage von Arbeiten, die von der Android Open Source Project erstellt und gemeinsam verwendet und gemäß den in der 2.5 Attribution License beschriebenen Begriffen verwendet werden.

Eigenschaften

Name Beschreibung
Class

Gibt die Laufzeitklasse dieses Werts Objectzurück.

(Geerbt von Object)
Handle

Das Handle für die zugrunde liegende Android-Instanz.

(Geerbt von Object)
JniIdentityHashCode

Ruft den Identitätshashcode ab, der diesem Java Peer von der Interop-Laufzeit zugewiesen ist.

(Geerbt von Object)
JniManagedPeerState

Eine Einrichtung zum Laden von Implementierungen eines Dienstes.

(Geerbt von JavaObject)
JniPeerMembers

Eine Einrichtung zum Laden von Implementierungen eines Dienstes.

PeerReference

Ruft den JNI-Objektverweis für diesen Java Peer ab.

(Geerbt von Object)
ThresholdClass

Diese API unterstützt die Mono für Android-Infrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code vorgesehen.

(Geerbt von Object)
ThresholdType

Diese API unterstützt die Mono für Android-Infrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code vorgesehen.

(Geerbt von Object)

Methoden

Name Beschreibung
Clone()

Erstellt und gibt eine Kopie dieses Objekts zurück.

(Geerbt von Object)
Construct(JniObjectReference, JniObjectReferenceOptions)

Eine Einrichtung zum Laden von Implementierungen eines Dienstes.

(Geerbt von JavaObject)
Dispose()

Veröffentlicht die Ressourcen, die von diesem Java Peer gehalten werden.

(Geerbt von Object)
Dispose(Boolean)

Veröffentlicht die Ressourcen, die von diesem Java Peer gehalten werden.

(Geerbt von Object)
DisposeUnlessReferenced()

Eine Einrichtung zum Laden von Implementierungen eines Dienstes.

(Geerbt von JavaObject)
Equals(Object)

Eine Einrichtung zum Laden von Implementierungen eines Dienstes.

(Geerbt von JavaObject)
Equals(Object)

Gibt an, ob ein anderes Objekt "gleich" diesem Objekt ist.

(Geerbt von Object)
FindFirst()

Laden Sie den ersten verfügbaren Dienstanbieter des Diensts dieses Ladegeräts.

GetHashCode()

Gibt einen Hashcodewert für das Objekt zurück.

(Geerbt von Object)
Iterator()

Lazily lädt die verfügbaren Anbieter des Ladeladediensts.

JavaFinalize()

Wird vom Garbage Collector für ein Objekt aufgerufen, wenn die Garbage Collection bestimmt, dass keine weiteren Verweise auf das Objekt vorhanden sind.

(Geerbt von Object)
Load(Class, ClassLoader)

Erstellt ein neues Dienstladeprogramm für den angegebenen Diensttyp und klassenladeprogramm.

Load(Class)

Erstellt ein neues Dienstladeprogramm für den angegebenen Diensttyp mit dem Java des aktuellen Threads.

LoadInstalled(Class)

Erstellt mit dem Erweiterungsklassenladeprogramm einen neuen Dienstladeprogramm für den angegebenen Diensttyp.

Notify()

Aktiviert einen einzelnen Thread, der auf dem Monitor dieses Objekts wartet.

(Geerbt von Object)
NotifyAll()

Aktiviert alle Threads, die auf dem Monitor dieses Objekts warten.

(Geerbt von Object)
Reload()

Löschen Sie den Anbietercache dieses Ladegeräts, damit alle Anbieter neu geladen werden.

SetHandle(IntPtr, JniHandleOwnership)

Legt die Handle-Eigenschaft fest.

(Geerbt von Object)
SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

Eine Einrichtung zum Laden von Implementierungen eines Dienstes.

(Geerbt von JavaObject)
ToArray<T>()

Erstellt ein verwaltetes Array aus diesem Java Arraywrapper.

(Geerbt von Object)
ToString()

Gibt eine Zeichenfolgendarstellung des Objekts zurück.

(Geerbt von Object)
UnregisterFromRuntime()

Hebt die Registrierung dieses Java Peers aus der Interop-Laufzeit auf.

(Geerbt von Object)
Wait()

Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch em benachrichtigt/em< oder >em<unterbrochen>/em<.><>

(Geerbt von Object)
Wait(Int64, Int32)

Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch <em>benachrichtigt</em> oder <em>unterbrochen</em> oder bis eine bestimmte Menge an Echtzeit verstrichen ist.

(Geerbt von Object)
Wait(Int64)

Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch <em>benachrichtigt</em> oder <em>unterbrochen</em> oder bis eine bestimmte Menge an Echtzeit verstrichen ist.

(Geerbt von Object)

Explizite Schnittstellenimplementierungen

Name Beschreibung
IJavaPeerable.Disposed()

Eine Einrichtung zum Laden von Implementierungen eines Dienstes.

(Geerbt von JavaObject)
IJavaPeerable.Finalized()

Eine Einrichtung zum Laden von Implementierungen eines Dienstes.

(Geerbt von JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

Eine Einrichtung zum Laden von Implementierungen eines Dienstes.

(Geerbt von JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Eine Einrichtung zum Laden von Implementierungen eines Dienstes.

(Geerbt von JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Eine Einrichtung zum Laden von Implementierungen eines Dienstes.

(Geerbt von JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

Eine Einrichtung zum Laden von Implementierungen eines Dienstes.

(Geerbt von JavaObject)
IJavaPeerable.UnregisterFromRuntime()

Eine Einrichtung zum Laden von Implementierungen eines Dienstes.

Erweiterungsmethoden

Name Beschreibung
GetJniTypeName(IJavaPeerable)

Ruft den JNI-Namen des Typs der Instanz selfab.

JavaAs<TResult>(IJavaPeerable)

Versuchen Sie, die Eingabe selfzu TResult erzwingen, und überprüfen Sie, ob die Koersion auf der Java Seite gültig ist.

JavaCast<TResult>(IJavaObject)

Führt eine android-laufzeitgecheckte Typkonvertierung aus.

JavaCast<TResult>(IJavaObject)

Eine Einrichtung zum Laden von Implementierungen eines Dienstes.

ToEnumerable(IIterable)

Eine Einrichtung zum Laden von Implementierungen eines Dienstes.

ToEnumerable<T>(IIterable)

Eine Einrichtung zum Laden von Implementierungen eines Dienstes.

TryJavaCast<TResult>(IJavaPeerable, TResult)

Versuchen Sie, die Eingabe selfzu TResult erzwingen, und überprüfen Sie, ob die Koersion auf der Java Seite gültig ist.

Gilt für: