Langage

ServiceLoader Classe

Définition

Installation permettant de charger des implémentations d’un service.

[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
Héritage
ServiceLoader
Attributs
Implémente

Remarques

Installation permettant de charger des implémentations d’un service.

Un service est une interface ou une classe connue pour laquelle zéro, un ou plusieurs fournisseurs de services existent. Un fournisseur de services ( ou simplement un fournisseur) est une classe qui implémente ou sous-classe l’interface ou la classe connue. Il ServiceLoader s’agit d’un objet qui localise et charge les fournisseurs de services déployés dans l’environnement d’exécution à la fois du choix d’une application. Le code d’application fait uniquement référence au service, non aux fournisseurs de services et est supposé être capable de choisir entre plusieurs fournisseurs de services (en fonction des fonctionnalités qu’ils exposent via le service) et de gérer la possibilité qu’aucun fournisseur de services ne se trouve.

<h2> Obtention d’un chargeur <de service /h2>

Une application obtient un chargeur de service pour un service donné en appelant l’une des méthodes statiques load de ServiceLoader. <--If l’application est un module, sa déclaration de module doit avoir une directive d’utilisation qui spécifie le service ; cela permet de localiser les fournisseurs et de s’assurer qu’ils s’exécutent de manière fiable. En outre, si le module d’application ne contient pas le service, sa déclaration de module doit avoir une directive requise qui spécifie le module qui exporte le service. Il est fortement recommandé que le module d’application ne <>nécessite pas</b> de modules qui contiennent des fournisseurs du service.---/>

Un chargeur de service peut être utilisé pour localiser et instancier des fournisseurs du service à l’aide de la #iterator() iterator méthode. ServiceLoader définit également la #stream() stream méthode pour obtenir un flux de fournisseurs qui peuvent être inspectés et filtrés sans les instancier.

Par exemple, supposons que le service soit com.example.CodecFactory, une interface qui définit des méthodes pour produire des encodeurs et des décodeurs :

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

Le code suivant obtient un chargeur de service pour le CodecFactory service, puis utilise son itérateur (créé automatiquement par la boucle enhanced-for) pour générer des instances des fournisseurs de services situés :

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

Parfois, une application peut souhaiter inspecter un fournisseur de services avant de l’instancier, afin de déterminer si une instance de ce fournisseur de services serait utile. Par exemple, un fournisseur de CodecFactory services pour lequel il est capable de produire un encodeur « PNG » peut être annoté avec @PNG. Le code suivant utilise la méthode du chargeur de stream service pour générer des instances de Provider<CodecFactory> contrairement à la façon dont l’itérateur génère des instances de 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 flux d’objets <>/li liProvider<CodecFactory><>< génère un >p.type()/li liClass<CodecFactory><>< génère une instance de >get()/liCodecFactory</ol><>

<h2> Conception de services </h2>

Un service est un type unique, généralement une interface ou une classe abstraite. Une classe concrète peut être utilisée, mais cela n’est pas recommandé. Le type peut avoir n’importe quelle accessibilité. Les méthodes d’un service sont très spécifiques à un domaine, de sorte que cette spécification d’API ne peut pas donner de conseils concrets sur leur forme ou leur fonction. Toutefois, il existe deux lignes directrices générales : <ol><li>

Un service doit déclarer autant de méthodes que nécessaire pour permettre aux fournisseurs de services de communiquer leurs propriétés spécifiques au domaine et d’autres facteurs de qualité d’implémentation. Une application qui obtient un chargeur de service pour le service peut ensuite appeler ces méthodes sur chaque instance d’un fournisseur de services afin de choisir le meilleur fournisseur pour l’application.

</li li><>

Un service doit indiquer si ses fournisseurs de services sont destinés à être des implémentations directes du service ou à être un mécanisme d’indirection tel qu’un « proxy » ou une « fabrique ». Les fournisseurs de services ont tendance à être des mécanismes d’indirection lorsque les objets spécifiques au domaine sont relativement coûteux à instancier ; dans ce cas, le service doit être conçu afin que les fournisseurs de services soient des abstractions qui créent l’implémentation « réelle » à la demande. Par exemple, le CodecFactory service exprime par son nom que ses fournisseurs de services sont des fabriques de codecs, plutôt que des codecs eux-mêmes, car il peut être coûteux ou compliqué de produire certains codecs.

</li></ol>

<h2> « developing-service-providers">Développement de fournisseurs< de services/h2>

Un fournisseur de services est un type unique, généralement une classe concrète. Une interface ou une classe abstraite est autorisée, car elle peut déclarer une méthode de fournisseur statique, décrite plus loin. Le type doit être public et ne doit pas être une classe interne.

Un fournisseur de services et son code de prise en charge peuvent être développés dans un module, qui est ensuite déployé sur le chemin du module d’application ou dans une image modulaire. Vous pouvez également empaquetager un fournisseur de services et son code de prise en charge en tant que fichier JAR et être déployé sur le chemin d’accès de la classe d’application. L’avantage de développer un fournisseur de services dans un module est que le fournisseur peut être entièrement encapsulé pour masquer tous les détails de son implémentation.

Une application qui obtient un chargeur de service pour un service donné est indifférente à ce que les fournisseurs du service soient déployés dans des modules ou empaquetés en tant que fichiers JAR. L’application instancie les fournisseurs de services via l’itérateur du chargeur de service, ou via Provider Provider des objets dans le flux du chargeur de service, sans connaître les emplacements des fournisseurs de services.

<h2> Déploiement de fournisseurs de services sur le chemin <de classe /h2>

Un fournisseur de services empaqueté en tant que fichier JAR pour le chemin d’accès de classe est identifié en plaçant un fichier de configuration de fournisseur dans le répertoire META-INF/servicesde ressources. Le nom du fichier de configuration du fournisseur est le nom binaire complet du service. Le fichier de configuration du fournisseur contient une liste de noms binaires complets des fournisseurs de services, un par ligne.

Par exemple, supposons que le fournisseur de com.example.impl.StandardCodecs services soit empaqueté dans un fichier JAR pour le chemin d’accès à la classe. Le fichier JAR contient un fichier de configuration de fournisseur nommé :

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

qui contient la ligne :

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

« format »> Le fichier de configuration du fournisseur doit être encodé en UTF-8. Les espaces et les tabulations entourant le nom de chaque fournisseur de services, ainsi que les lignes vides, sont ignorés. Le caractère de commentaire est '#' (U+0023<span style="font-size :smaller ; »>NOMBRE SIGN</span>) ; sur chaque ligne tous les caractères qui suivent le premier caractère de commentaire sont ignorés. Si un nom de classe de fournisseur de services est répertorié plusieurs fois dans un fichier de configuration de fournisseur, le doublon est ignoré. Si une classe de fournisseur de services est nommée dans plusieurs fichiers de configuration, le doublon est ignoré.

Un fournisseur de services mentionné dans un fichier de configuration de fournisseur peut se trouver dans le même fichier JAR que le fichier de configuration du fournisseur ou dans un autre fichier JAR. Le fournisseur de services doit être visible à partir du chargeur de classes qui est initialement interrogé pour localiser le fichier de configuration du fournisseur ; ce n’est pas nécessairement le chargeur de classes qui localise finalement le fichier de configuration du fournisseur.

<h2> Minutage de la découverte <du fournisseur /h2>

Les fournisseurs de services sont chargés et instanciés de manière instanciée, c’est-à-dire à la demande. Un chargeur de service gère un cache des fournisseurs qui ont été chargés jusqu’à présent. Chaque appel de la iterator méthode retourne un Iterator qui génère d’abord tous les éléments mis en cache à partir de l’itération précédente, dans l’ordre d’instanciation, puis localise et instancie de manière différée tous les fournisseurs restants, en ajoutant chacun au cache à son tour. De même, chaque appel de la méthode de flux retourne un Stream processus qui traite d’abord tous les fournisseurs chargés par les opérations de flux précédentes, dans l’ordre de chargement, puis localise les fournisseurs restants. Les caches sont effacés via la #reload reload méthode.

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

Lorsque vous utilisez le chargeur de iteratorservice, les Iterator#hasNext() hasNext méthodes échouent Iterator#next() nextServiceConfigurationError si une erreur se produit lors de la localisation, du chargement ou de l’instanciation d’un fournisseur de services. Lorsque vous traitez le flux du chargeur de service, ServiceConfigurationError il peut être levée par n’importe quelle méthode qui provoque le chargement ou l’emplacement d’un fournisseur de services.

Lors du chargement ou de l’instanciation d’un fournisseur de services dans un module, ServiceConfigurationError peut être levée pour les raisons suivantes :

Lors de la lecture d’un fichier de configuration de fournisseur, ou lors du chargement ou de l’instanciation d’une classe de fournisseur nommée dans un fichier de configuration de fournisseur, vous ServiceConfigurationError pouvez le lever pour les raisons suivantes :

<ul>

<li> Le format du fichier de configuration du fournisseur ne respecte pas le format spécifié ci-dessus ; </li>

<li> An IOException IOException se produit lors de la lecture du fichier de configuration du fournisseur ; </li>

<le fournisseur de services li> A ne peut pas être chargé ; </li>

<li> A service provider n’est pas assignable à l’interface ou à la classe du service, ou ne définit pas de constructeur de fournisseur, ou ne peut pas être instancié. </li>

</ul>

<h2> Concurrency </h2>

Les instances de cette classe ne sont pas sécurisées pour une utilisation par plusieurs threads simultanés.

<gestion h3> Null </h3>

Sauf indication contraire, le passage d’un null argument à une méthode de cette classe entraîne la levée d’un NullPointerException argument.

Ajouté dans la version 1.6.

Java documentation pour java.util.ServiceLoader.

Les parties de cette page sont des modifications basées sur le travail créé et partagé par Android Open Source et utilisées en fonction des termes décrits dans la Creative Commons 2.5 Attribution License.

Propriétés

Nom Description
Class

Retourne la classe runtime de ce Object.

(Hérité de Object)
Handle

Handle de l’instance Android sous-jacente.

(Hérité de Object)
JniIdentityHashCode

Obtient le code de hachage d’identité affecté à cet homologue Java par le runtime d’interopérabilité.

(Hérité de Object)
JniManagedPeerState

Installation permettant de charger des implémentations d’un service.

(Hérité de JavaObject)
JniPeerMembers

Installation permettant de charger des implémentations d’un service.

PeerReference

Obtient la référence d’objet JNI pour cet homologue Java.

(Hérité de Object)
ThresholdClass

Cette API prend en charge l’infrastructure Mono pour Android et n’est pas destinée à être utilisée directement à partir de votre code.

(Hérité de Object)
ThresholdType

Cette API prend en charge l’infrastructure Mono pour Android et n’est pas destinée à être utilisée directement à partir de votre code.

(Hérité de Object)

Méthodes

Nom Description
Clone()

Crée et retourne une copie de cet objet.

(Hérité de Object)
Construct(JniObjectReference, JniObjectReferenceOptions)

Installation permettant de charger des implémentations d’un service.

(Hérité de JavaObject)
Dispose()

Libère les ressources détenues par cet homologue Java.

(Hérité de Object)
Dispose(Boolean)

Libère les ressources détenues par cet homologue Java.

(Hérité de Object)
DisposeUnlessReferenced()

Installation permettant de charger des implémentations d’un service.

(Hérité de JavaObject)
Equals(Object)

Installation permettant de charger des implémentations d’un service.

(Hérité de JavaObject)
Equals(Object)

Indique si un autre objet est « égal à » celui-ci.

(Hérité de Object)
FindFirst()

Chargez le premier fournisseur de services disponible du service de ce chargeur.

GetHashCode()

Retourne une valeur de code de hachage pour l'objet.

(Hérité de Object)
Iterator()

Lazily charge les fournisseurs disponibles du service de ce chargeur.

JavaFinalize()

Appelé par le garbage collector sur un objet lorsque le garbage collection détermine qu’il n’y a plus de références à l’objet.

(Hérité de Object)
Load(Class, ClassLoader)

Crée un chargeur de service pour le type de service et le chargeur de classe donnés.

Load(Class)

Crée un chargeur de service pour le type de service donné, à l’aide de java du thread actuel.

LoadInstalled(Class)

Crée un chargeur de service pour le type de service donné, à l’aide du chargeur de classe d’extension.

Notify()

Réveille un thread unique qui attend le moniteur de cet objet.

(Hérité de Object)
NotifyAll()

Réveille tous les threads qui attendent le moniteur de cet objet.

(Hérité de Object)
Reload()

Effacez le cache du fournisseur de ce chargeur afin que tous les fournisseurs soient rechargés.

SetHandle(IntPtr, JniHandleOwnership)

Définit la propriété Handle.

(Hérité de Object)
SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

Installation permettant de charger des implémentations d’un service.

(Hérité de JavaObject)
ToArray<T>()

Crée un tableau managé à partir de ce wrapper de tableau Java.

(Hérité de Object)
ToString()

Retourne une représentation de chaîne de l'objet.

(Hérité de Object)
UnregisterFromRuntime()

Annule l’inscription de cet homologue Java à partir du runtime d’interopérabilité.

(Hérité de Object)
Wait()

Provoque l’attente du thread actuel jusqu’à ce qu’il soit réveillé, généralement en étant <averti par em ou><em>interrompu</em>.<>

(Hérité de Object)
Wait(Int64, Int32)

Provoque l’attente du thread actuel jusqu’à ce qu’il soit réveillé, généralement en étant <averti> par< em>ou <em>interrompu/em<,> ou jusqu’à ce qu’une certaine quantité de temps réel s’est écoulée.

(Hérité de Object)
Wait(Int64)

Provoque l’attente du thread actuel jusqu’à ce qu’il soit réveillé, généralement en étant <averti> par< em>ou <em>interrompu/em<,> ou jusqu’à ce qu’une certaine quantité de temps réel s’est écoulée.

(Hérité de Object)

Implémentations d’interfaces explicites

Nom Description
IJavaPeerable.Disposed()

Installation permettant de charger des implémentations d’un service.

(Hérité de JavaObject)
IJavaPeerable.Finalized()

Installation permettant de charger des implémentations d’un service.

(Hérité de JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

Installation permettant de charger des implémentations d’un service.

(Hérité de JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Installation permettant de charger des implémentations d’un service.

(Hérité de JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Installation permettant de charger des implémentations d’un service.

(Hérité de JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

Installation permettant de charger des implémentations d’un service.

(Hérité de JavaObject)
IJavaPeerable.UnregisterFromRuntime()

Installation permettant de charger des implémentations d’un service.

Méthodes d’extension

Nom Description
GetJniTypeName(IJavaPeerable)

Obtient le nom JNI du type de l’instance self.

JavaAs<TResult>(IJavaPeerable)

Essayez de forcer self le typeTResult, en vérifiant que le forçage est valide côté Java.

JavaCast<TResult>(IJavaObject)

Effectue une conversion de type vérifiée par le runtime Android.

JavaCast<TResult>(IJavaObject)

Installation permettant de charger des implémentations d’un service.

ToEnumerable(IIterable)

Installation permettant de charger des implémentations d’un service.

ToEnumerable<T>(IIterable)

Installation permettant de charger des implémentations d’un service.

TryJavaCast<TResult>(IJavaPeerable, TResult)

Essayez de forcer self le typeTResult, en vérifiant que le forçage est valide côté Java.

S’applique à