Ich habe es noch nicht im einzelnen nachvollzogen, aber der Service Loader kann mir eine Instanz der geforderten Klasse liefern? Das ist natürlich sehr elegant, da muss ich also gar nicht eine geeignete Factory bauen, der Service Loader hat das schon im, Bauch?
Ja, so in der Art.
Hast Du Dir den ServiceLoader mit dem Beispiel in der Dokumentation einmal angesehen? Dort ist ja das Beispiel eines Services com.example.CodecSet gegeben. Das wäre also die Klasse, von der dann die Service Klassen erben sollen.
Die jar Datei enthält dann die Datei META-INF/services/com.example.CodecSet mit dem Namen der Implementation.
Nun kann der ServiceLoader genau so eine Instanz erzeugen. Wichtig ist: Das ist in der Regel erst die Klasse, die dann gewisse andere Implementationen holen kann. So ist das Beispiel ein getEncoder / getDecoder mit einem Parameter.
Also kann man sich alle implementierenden Services holen, und alle nach einem bestimmten Parameter fragen.
Ein Beispiel, wo das z.B. auch angewendet wird, sind jdbc Treiber. Es gibt dann Services, die sozusagen einen Datenbank Treiber laden können. Und dann kann also jeder Treiber gefragt werden: Hast Du einen Treiber für xyz? (Also z.B. für mysql. Der postgres Treiber wird dann sagen: "Hab ich nicht", aber der mysql Treiber wird sagen: "Jo, nimm den hier!" (Das war jetzt extrem bildlich aber ich denke, du hast das Bild damit bekommen.)
Generell sind das aber zwei Paar Schuhe:
a) Die Klassen erst einmal selbst laden können.
b) dann den Service verfügbar machen.
Der erste Punkt a ist also die Erzeugung eines ClassLoaders, der dann die zusätzlichen Klassen lädt.
Der zweite Punkt nutzt die von
@mihe7 in #10 verlinkte Methode load, die auch den ClassLoader als Parameter übergeben bekommt.
An der Stelle auch noch der Hinweis: in #3 gab es auch schon den Hinweis von @Oneixee5 zu OSGi.
Die Frage ist halt, was genau Du brauchst. Man kann sich hier das eine oder andere selbst bauen. Bei einfachen Ansprüchen geht es ganz schnell und es ist nicht besonders komplex. Sobald aber die Ansprüche steigen, dann kann man sich überlegen, ob ein OSGi Container (Eclipse Equinox, Apache Felix oder Apache Karaf) und die Erzeugung von OSGi Bundles (das kann schon ein einfaches maven-bundle-plugin mit minimaler Config sein) nicht ein besserer Ansatz sein könnte. Aber es kommen halt doch deutliche Abhängigkeiten und auch etwas mehr Komplexität hinzu. (Aber es ist eine bekannte Komplexität. Du hast da nicht etwas selbstgebautes und da muss man erst rein kommen, sondern man hat etwas vor sich, das ggf. bekannt ist und wenn nicht, dann kann man sich da gezielt schnell einarbeiten.)