Normal
Du machst ein Interface z.B. [c]com.example.foo.ServiceA[/c] und in dem externen Modul machst du dann eine entsprechende Implementierung des Interfaces. Um deinem Hauptprogramm dann die Implementierung bekannt zu machen, erzeugst du in "META-INF/services" eine Datei mit dem CanonicalName (also Classname + Package-Path "com.example.foo.ServiceA") als Dateinamen und schreibst den CanonicalName der Implementierung rein.Um dann die entsprechenden Implementierungen zu holen (es könnte ja mehr als ein Modul eine Implementierung mitbringen):[code=Java]ServiceLoader<ServiceA> serviceLoader = ServiceLoader.load(ServiceA.class)for (ServiceA service : serviceLoader ) { // do something with the implementation}[/code]Die einzige Voraussetzung ist: Die Service-Implementierung benötigt einen Zero-Arg Constructor, damit der ServiceLoader sie instanziieren kann.
Du machst ein Interface z.B. [c]com.example.foo.ServiceA[/c] und in dem externen Modul machst du dann eine entsprechende Implementierung des Interfaces. Um deinem Hauptprogramm dann die Implementierung bekannt zu machen, erzeugst du in "META-INF/services" eine Datei mit dem CanonicalName (also Classname + Package-Path "com.example.foo.ServiceA") als Dateinamen und schreibst den CanonicalName der Implementierung rein.
Um dann die entsprechenden Implementierungen zu holen (es könnte ja mehr als ein Modul eine Implementierung mitbringen):
[code=Java]ServiceLoader<ServiceA> serviceLoader = ServiceLoader.load(ServiceA.class)
for (ServiceA service : serviceLoader ) {
// do something with the implementation
}[/code]
Die einzige Voraussetzung ist: Die Service-Implementierung benötigt einen Zero-Arg Constructor, damit der ServiceLoader sie instanziieren kann.