2012-04-24 13 views
20

He intentado utilizar el Java ServiceLoader para encontrar todas las clases que implementan una interfaz específica de este modo:ServiceLoader encontrar implementaciones de una interfaz

loader = ServiceLoader.load(Operation.class); 
try { 
    for (Operation o : loader) { 
     operations.add(o); 
    } 
} catch (ServiceConfigurationError e) { 
    LOGGER.log(Level.SEVERE, "Uncaught exception", e); 
} 

Por desgracia, cuando corro Eclipse en el modo de depuración ServiceLoader no lo hace encuentra cualquier clase Siento que me falta un punto trivial ...

+6

¿Tiene 'META-INF/services/fqcn.Operation' configurado? – nobeh

Respuesta

25

ServiceLoader no puedo hacerlo.

Para exponer la clase como un servicio que se puede descubrir por ServiceLoader, debe poner su nombre en el archivo de configuración del proveedor, como se describe en Creating Extensible Applications With the Java Platform .

No hay formas integradas de encontrar todas las clases que implementan una interfaz en particular. Los marcos que pueden hacer algo similar utilizan sus propias soluciones de escaneo classpath (e incluso con el escaneo classpath personalizado no es fácil porque los archivos .class solo almacenan información sobre las interfaces implementadas directamente, no transitivamente).

18

Si las implementaciones son los que escribió usted mismo, usted podría utilizar 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 { 

} 
+2

¡Muchas gracias por esta sugerencia! No pude conseguir el archivo de proveedor para funcionar. Debe haber estado colocándolo en el lugar equivocado o con un error tipográfico o algo así, pero esto funcionó de la caja con maven. Puede encontrar la última versión en el repositorio de maven en http://mvnrepository.com/artifact/com.google.auto.service/auto-service –

+0

¡Es un placer! Si tiene mejoras, edite la respuesta para los espectadores del futuro (en el futuro) – Xiao

+0

¡Este auto servicio es brillante! – Frankie

0

Con el fin de analizar su ruta de clase en tiempo de ejecución para las implementaciones de interfaz específica que lo haría necesidad de usar una solución diferente, por ej. Reflections (aviso s al final, esto no es la API de reflexión de Java)

Cuestiones relacionadas