ServiceLoader Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Una instalación para cargar implementaciones de un servicio.
[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
- Herencia
- Atributos
- Implementaciones
Comentarios
Una instalación para cargar implementaciones de un servicio.
Un servicio es una interfaz o clase conocida para la que existen cero, uno o varios proveedores de servicios. Un proveedor de servicios (o simplemente proveedor) es una clase que implementa o subclase la interfaz o clase conocidas. Es ServiceLoader un objeto que localiza y carga los proveedores de servicios implementados en el entorno en tiempo de ejecución en un momento de la elección de una aplicación. El código de aplicación solo hace referencia al servicio, no a los proveedores de servicios y se supone que es capaz de elegir entre varios proveedores de servicios (en función de la funcionalidad que exponen a través del servicio) y controlar la posibilidad de que no se encuentren proveedores de servicios.
<h2> Obtención de un cargador <de servicio /h2>
Una aplicación obtiene un cargador de servicio para un servicio determinado invocando uno de los métodos estáticos load de ServiceLoader.
<--Si la aplicación es un módulo, su declaración de módulo debe tener una directiva uses que especifique el servicio; esto ayuda a localizar proveedores y asegurarse de que se ejecutarán de forma confiable. Además, si el módulo de aplicación no contiene el servicio, su declaración de módulo debe tener una directiva require que especifique el módulo que exporta el servicio. Se recomienda encarecidamente que el módulo de aplicación no <b></b> requiera módulos que contengan proveedores del servicio.--/>
Se puede usar un cargador de servicios para localizar y crear instancias de proveedores del servicio mediante el #iterator() iterator método .
ServiceLoader también define el #stream() stream método para obtener una secuencia de proveedores que se pueden inspeccionar y filtrar sin crear instancias de ellos.
Por ejemplo, supongamos que el servicio es com.example.CodecFactory, una interfaz que define métodos para generar codificadores y descodificadores:
{@code
package com.example;
public interface CodecFactory {
Encoder getEncoder(String encodingName);
Decoder getDecoder(String encodingName);
}
}
El código siguiente obtiene un cargador de servicio para el CodecFactory servicio y, a continuación, usa su iterador (creado automáticamente por el bucle enhanced-for) para producir instancias de los proveedores de servicios que se encuentran:
{@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 veces, una aplicación puede querer inspeccionar un proveedor de servicios antes de crear una instancia de él, con el fin de determinar si una instancia de ese proveedor de servicios sería útil. Por ejemplo, un proveedor de servicios para CodecFactory que sea capaz de generar un codificador "PNG" se puede anotar con @PNG. El código siguiente usa el método del cargador de stream servicios para producir instancias de Provider<CodecFactory> en contraste con la forma en que el iterador produce instancias 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 flujo de < objetos >/liProvider<CodecFactory><li>< produce un >p.type()/liClass<CodecFactory><li>< produce una instancia de >get()/li/liCodecFactory<><>
<h2> Diseño de servicios </h2>
Un servicio es un solo tipo, normalmente una interfaz o una clase abstracta. Se puede usar una clase concreta, pero no se recomienda. El tipo puede tener cualquier accesibilidad. Los métodos de un servicio son muy específicos del dominio, por lo que esta especificación de API no puede dar consejos concretos sobre su forma o función. Sin embargo, hay dos directrices generales: <ol><li>
Un servicio debe declarar tantos métodos como sea necesario para permitir que los proveedores de servicios comuniquen sus propiedades específicas del dominio y otros factores de calidad de implementación. Una aplicación que obtiene un cargador de servicios para el servicio puede invocar estos métodos en cada instancia de un proveedor de servicios, con el fin de elegir el mejor proveedor para la aplicación.
</li li><>
Un servicio debe expresar si sus proveedores de servicios están diseñados para ser implementaciones directas del servicio o para ser un mecanismo de direccionamiento indirecto, como un "proxy" o un "generador". Los proveedores de servicios tienden a ser mecanismos de direccionamiento indirecto cuando los objetos específicos del dominio son relativamente caros de crear instancias; en este caso, el servicio debe diseñarse para que los proveedores de servicios sean abstracciones que crean la implementación "real" a petición. Por ejemplo, el CodecFactory servicio expresa a través de su nombre que sus proveedores de servicios son generadores de códecs, en lugar de códecs por sí mismos, ya que puede ser costoso o complicado producir ciertos códecs.
</li></ol>
<h2> "developing-service-providers">Developing< service providers/h2>
Un proveedor de servicios es un único tipo, normalmente una clase concreta. Se permite una interfaz o una clase abstracta porque puede declarar un método de proveedor estático, que se describe más adelante. El tipo debe ser público y no debe ser una clase interna.
Un proveedor de servicios y su código auxiliar se pueden desarrollar en un módulo, que luego se implementa en la ruta de acceso del módulo de aplicación o en una imagen modular. Como alternativa, un proveedor de servicios y su código auxiliar se pueden empaquetar como un archivo JAR e implementarse en la ruta de acceso de la clase de aplicación. La ventaja de desarrollar un proveedor de servicios en un módulo es que el proveedor se puede encapsular completamente para ocultar todos los detalles de su implementación.
Una aplicación que obtiene un cargador de servicios para un servicio determinado es indiferente a si los proveedores del servicio se implementan en módulos o se empaquetan como archivos JAR. La aplicación crea instancias de los proveedores de servicios a través del iterador del cargador de servicios, o a través Provider Provider de objetos en el flujo del cargador de servicios, sin conocimiento de las ubicaciones de los proveedores de servicios.
<h2> Implementación de proveedores de servicios en la ruta de acceso <de clase /h2>
Un proveedor de servicios que se empaqueta como un archivo JAR para la ruta de acceso de clase se identifica colocando un archivo de configuración de proveedor en el directorio META-INF/servicesde recursos . El nombre del archivo de configuración del proveedor es el nombre binario completo del servicio. El archivo de configuración del proveedor contiene una lista de nombres binarios completos de proveedores de servicios, uno por línea.
Por ejemplo, supongamos que el proveedor de servicios com.example.impl.StandardCodecs se empaqueta en un archivo JAR para la ruta de acceso de clase. El archivo JAR contendrá un archivo de configuración de proveedor denominado:
<blockquote>META-INF/services/com.example.CodecFactory</blockquote>
que contiene la línea :
<blockquote>com.example.impl.StandardCodecs # Standard codecs</blockquote>
"format">El archivo de configuración del proveedor debe estar codificado en UTF-8. Se omiten los caracteres de espacio y tabulación que rodean el nombre de cada proveedor de servicios, así como las líneas en blanco. El carácter de comentario es '#' (U+0023<span style="font-size:smaller;">NUMBER SIGN</span>); en cada línea se omiten todos los caracteres que siguen al primer carácter de comentario. Si un nombre de clase de proveedor de servicios aparece más de una vez en un archivo de configuración de proveedor, se omite el duplicado. Si una clase de proveedor de servicios se denomina en más de un archivo de configuración, se omite el duplicado.
Un proveedor de servicios que se menciona en un archivo de configuración de proveedor puede encontrarse en el mismo archivo JAR que el archivo de configuración del proveedor o en otro archivo JAR. El proveedor de servicios debe ser visible desde el cargador de clases que se consulta inicialmente para localizar el archivo de configuración del proveedor; esto no es necesariamente el cargador de clases que, en última instancia, localiza el archivo de configuración del proveedor.
<h2> Tiempo de detección <del proveedor /h2>
Los proveedores de servicios se cargan y crean instancias de forma diferida, es decir, a petición. Un cargador de servicios mantiene una memoria caché de los proveedores que se han cargado hasta ahora. Cada invocación del iterator método devuelve un Iterator que produce primero todos los elementos almacenados en caché de la iteración anterior, en orden de creación de instancias y, a continuación, localiza y crea instancias de los proveedores restantes, agregando cada uno a la memoria caché a su vez. Del mismo modo, cada invocación del método de secuencia devuelve un Stream que procesa primero todos los proveedores cargados por las operaciones de flujo anteriores, en orden de carga y, a continuación, localiza de forma diferida los proveedores restantes. Las memorias caché se borran mediante el #reload reload método .
<h2> "errors">Errors</h2>
Al usar el cargador de iteratorservicios , los Iterator#hasNext() hasNext métodos y Iterator#next() next producirán ServiceConfigurationError un error si se produce un error al localizar, cargar o crear instancias de un proveedor de servicios. Al procesar la secuencia del cargador de servicios, ServiceConfigurationError cualquier método que haga que un proveedor de servicios se encuentre o cargue.
Al cargar o crear instancias de un proveedor de servicios en un módulo, ServiceConfigurationError se puede producir por los siguientes motivos:
Al leer un archivo de configuración de proveedor, o cargar o crear instancias de una clase de proveedor denominada en un archivo de configuración de proveedor, ServiceConfigurationError se puede producir por los siguientes motivos:
<ul>
<li> El formato del archivo de configuración del proveedor infringe el formato especificado anteriormente; </li>
<li> Se IOException IOException produce al leer el archivo de configuración del proveedor; </li>
<li> Un proveedor de servicios no se puede cargar; </li>
<li> Un proveedor de servicios no se puede asignar a la interfaz o clase del servicio, o no define un constructor de proveedor o no se puede crear una instancia. </li>
</ul>
<h2> Simultaneidad </h2>
Las instancias de esta clase no son seguras para su uso por varios subprocesos simultáneos.
<h3> Control nulo </h3>
A menos que se especifique lo contrario, pasar un null argumento a cualquier método de esta clase hará que se produzca una NullPointerException excepción .
Agregado en la versión 1.6.
Java documentación para java.util.ServiceLoader.
Las partes de esta página son modificaciones basadas en el trabajo creado y compartido por el proyecto de código abierto de Android y se usan según los términos descritos en la licencia de atribución de Creative Commons 2.5.
Propiedades
| Nombre | Description |
|---|---|
| Class |
Devuelve la clase en tiempo de ejecución de este |
| Handle |
Identificador de la instancia de Android subyacente. (Heredado de Object) |
| JniIdentityHashCode |
Obtiene el código hash de identidad asignado a este Java del mismo nivel por el tiempo de ejecución de interoperabilidad. (Heredado de Object) |
| JniManagedPeerState |
Una instalación para cargar implementaciones de un servicio. (Heredado de JavaObject) |
| JniPeerMembers |
Una instalación para cargar implementaciones de un servicio. |
| PeerReference |
Obtiene la referencia de objeto JNI para este Java del mismo nivel. (Heredado de Object) |
| ThresholdClass |
Esta API admite la infraestructura mono para Android y no está pensada para usarse directamente desde el código. (Heredado de Object) |
| ThresholdType |
Esta API admite la infraestructura mono para Android y no está pensada para usarse directamente desde el código. (Heredado de Object) |
Métodos
| Nombre | Description |
|---|---|
| Clone() |
Crea y devuelve una copia de este objeto. (Heredado de Object) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
Una instalación para cargar implementaciones de un servicio. (Heredado de JavaObject) |
| Dispose() |
Libera los recursos mantenidos por este Java del mismo nivel. (Heredado de Object) |
| Dispose(Boolean) |
Libera los recursos mantenidos por este Java del mismo nivel. (Heredado de Object) |
| DisposeUnlessReferenced() |
Una instalación para cargar implementaciones de un servicio. (Heredado de JavaObject) |
| Equals(Object) |
Una instalación para cargar implementaciones de un servicio. (Heredado de JavaObject) |
| Equals(Object) |
Indica si algún otro objeto es "igual a" este. (Heredado de Object) |
| FindFirst() |
Cargue el primer proveedor de servicios disponible del servicio de este cargador. |
| GetHashCode() |
Devuelve un valor de código hash para el objeto . (Heredado de Object) |
| Iterator() |
Carga de forma diferir los proveedores disponibles del servicio de este cargador. |
| JavaFinalize() |
Lo llama el recolector de elementos no utilizados en un objeto cuando la recolección de elementos no utilizados determina que no hay más referencias al objeto . (Heredado de Object) |
| Load(Class, ClassLoader) |
Crea un cargador de servicio para el tipo de servicio y el cargador de clases especificados. |
| Load(Class) |
Crea un nuevo cargador de servicio para el tipo de servicio determinado, mediante el java del subproceso actual. |
| LoadInstalled(Class) |
Crea un nuevo cargador de servicio para el tipo de servicio determinado, mediante el cargador de clases de extensión. |
| Notify() |
Activa un único subproceso que está esperando en el monitor de este objeto. (Heredado de Object) |
| NotifyAll() |
Activa todos los subprocesos que están esperando en el monitor de este objeto. (Heredado de Object) |
| Reload() |
Borre la caché del proveedor de este cargador para que todos los proveedores se vuelvan a cargar. |
| SetHandle(IntPtr, JniHandleOwnership) |
Establece la propiedad Handle. (Heredado de Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
Una instalación para cargar implementaciones de un servicio. (Heredado de JavaObject) |
| ToArray<T>() |
Crea una matriz administrada a partir de este contenedor de matriz Java. (Heredado de Object) |
| ToString() |
Devuelve una representación de cadena del objeto . (Heredado de Object) |
| UnregisterFromRuntime() |
Anula el registro de este Java del mismo nivel del tiempo de ejecución de interoperabilidad. (Heredado de Object) |
| Wait() |
Hace que el subproceso actual espere hasta que se despierte, normalmente por ser em notificado/em< o >em<interrumpido>/em<.><> (Heredado de Object) |
| Wait(Int64, Int32) |
Hace que el subproceso actual espere hasta que se despierte, normalmente por ser <em>notificado</em> o <em>interrumpido</em>, o hasta que haya transcurrido una cierta cantidad de tiempo real. (Heredado de Object) |
| Wait(Int64) |
Hace que el subproceso actual espere hasta que se despierte, normalmente por ser <em>notificado</em> o <em>interrumpido</em>, o hasta que haya transcurrido una cierta cantidad de tiempo real. (Heredado de Object) |
Implementaciones de interfaz explícitas
| Nombre | Description |
|---|---|
| IJavaPeerable.Disposed() |
Una instalación para cargar implementaciones de un servicio. (Heredado de JavaObject) |
| IJavaPeerable.Finalized() |
Una instalación para cargar implementaciones de un servicio. (Heredado de JavaObject) |
| IJavaPeerable.JniObjectReferenceControlBlock |
Una instalación para cargar implementaciones de un servicio. (Heredado de JavaObject) |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
Una instalación para cargar implementaciones de un servicio. (Heredado de JavaObject) |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Una instalación para cargar implementaciones de un servicio. (Heredado de JavaObject) |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
Una instalación para cargar implementaciones de un servicio. (Heredado de JavaObject) |
| IJavaPeerable.UnregisterFromRuntime() |
Una instalación para cargar implementaciones de un servicio. |
Métodos de extensión
| Nombre | Description |
|---|---|
| GetJniTypeName(IJavaPeerable) |
Obtiene el nombre JNI del tipo de la instancia |
| JavaAs<TResult>(IJavaPeerable) |
Intente coerción |
| JavaCast<TResult>(IJavaObject) |
Realiza una conversión de tipos comprobados en tiempo de ejecución de Android. |
| JavaCast<TResult>(IJavaObject) |
Una instalación para cargar implementaciones de un servicio. |
| ToEnumerable(IIterable) |
Una instalación para cargar implementaciones de un servicio. |
| ToEnumerable<T>(IIterable) |
Una instalación para cargar implementaciones de un servicio. |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
Intente coerción |