D
deprecated
Gast
Ich implementiere gerade eine kleine Applikation mit einer Art Plugin-System.
Plugins können sogenannte Services implementieren, die wiederum von anderen Plugins benutzt werden können.
Jeder Service wird in Form eines Subinterfaces beschrieben, das vom Hauptinterface Service erbt.
Nun zum Problem:
Ich suche nach einem einfachen Mechanismus, der es einem Plugin ermöglicht, möglichst einfach einen bestimmten Service zu nutzen, ohne die Klasse, die diesen Service konkret implementiert, zu kennen.
Welches Plugin für welchen Service herangezogen werden soll (das nenne ich ab jetzt Service-Provider), steht in einer Hashmap
Hier kann man mit
den aktuellen Service-Provider abrufen und anschließend benutzen.
Um zu verhindern, dass Plugin-Entwickler den Umweg über die Hashmap, Casting und das class-Objekt gehen müssen, habe ich folgende generische Methode implementiert.
Diese Methode können Plugins benutzen um den Service-Provider für einen bestimmten Service zu erhalten. Die Methode funktioniert eigentlich auch, d.h. sie gibt korrekt getypte Referenzen zurück.
Die Frage ist jetzt: wie implementiere ich den Methodenrumpf, d.h. wie bringe ich die Methode dazu, immer den passenden Service-Provider aus der Hashmap herauszuholen?
So etwas wie
funktioniert nicht, weil schon S.class nicht möglich ist.
Was mir also fehlt ist das class-Objekt zu der konkreten Klasse, mit der die generische Methode gerade aufgerufen wurde.
Über Tipps wie das hinzubekommen wäre, bin ich sehr dankbar ;-)
Plugins können sogenannte Services implementieren, die wiederum von anderen Plugins benutzt werden können.
Jeder Service wird in Form eines Subinterfaces beschrieben, das vom Hauptinterface Service erbt.
Code:
interface Service {
}
interface XYService extends Service {
public Object use();
}
Nun zum Problem:
Ich suche nach einem einfachen Mechanismus, der es einem Plugin ermöglicht, möglichst einfach einen bestimmten Service zu nutzen, ohne die Klasse, die diesen Service konkret implementiert, zu kennen.
Welches Plugin für welchen Service herangezogen werden soll (das nenne ich ab jetzt Service-Provider), steht in einer Hashmap
Code:
private HashMap<Class,Service> map;
Hier kann man mit
Code:
map.get(XYService.class);
Um zu verhindern, dass Plugin-Entwickler den Umweg über die Hashmap, Casting und das class-Objekt gehen müssen, habe ich folgende generische Methode implementiert.
Code:
public static <S extends Service> S provider() {
}
Diese Methode können Plugins benutzen um den Service-Provider für einen bestimmten Service zu erhalten. Die Methode funktioniert eigentlich auch, d.h. sie gibt korrekt getypte Referenzen zurück.
Die Frage ist jetzt: wie implementiere ich den Methodenrumpf, d.h. wie bringe ich die Methode dazu, immer den passenden Service-Provider aus der Hashmap herauszuholen?
So etwas wie
Code:
return map.get(S.class);
Was mir also fehlt ist das class-Objekt zu der konkreten Klasse, mit der die generische Methode gerade aufgerufen wurde.
Über Tipps wie das hinzubekommen wäre, bin ich sehr dankbar ;-)