java - ServiceLoader para encontrar implementaciones de una interfaz.
(3)
Intenté usar el Java ServiceLoader para encontrar todas las clases que implementan una interfaz específica como:
loader = ServiceLoader.load(Operation.class);
try {
for (Operation o : loader) {
operations.add(o);
}
} catch (ServiceConfigurationError e) {
LOGGER.log(Level.SEVERE, "Uncaught exception", e);
}
Desafortunadamente, cuando ejecuto Eclipse en modo de depuración, el ServiceLoader no encuentra ninguna clase. Siento que me falta un punto trivial ...
Para escanear su ruta de clase en tiempo de ejecución para implementaciones de interfaz específica, necesitaría usar una solución diferente, por ejemplo. Reflections (aviso s en el final, esto no es la API de reflexión de Java)
Si las implementaciones son las que usted mismo escribió, podría usar AutoService para que estén disponibles a través de la interfaz de ServiceLoader
, por ejemplo:
@AutoService(Operation.class)
class Foo implements FooInterface {
}
@AutoService(Operation.class)
class Bar extends Foo {
}
ServiceLoader
no puede hacerlo.
Para exponer la clase como un servicio que ServiceLoader
puede descubrir, debe colocar su nombre en el archivo de configuración del proveedor, como se describe en Creación de aplicaciones extensibles con la plataforma Java .
No hay formas integradas de encontrar todas las clases que implementan una interfaz particular. Los marcos que pueden hacer algo similar utilizan sus propias soluciones de escaneo de classpath (e incluso con el escaneo de classpath personalizado no es fácil porque los archivos .class
solo almacenan información sobre interfaces implementadas directamente, no de forma transitiva).