Holen Sie sich alle Unterklassen deklariert, die zur Laufzeit in Java?
Sagen wir, ich habe ein Paket, das enthält alle Unterklassen von 'Gerät', wie dieser:
class TV extends Device{
@override
public void run() {
//code goes here
}
private void moreMethods(String args){
//more code
}
}
In der main-Klasse sollte es möglich sein, zu instanziieren und ausführen von jeder Unterklasse des Geräts zur Laufzeit durch den Aufruf alle 'run' - Methode.
Der Vorteil davon ist, um Benutzern zu erlauben, setzen Sie einfach neue Gerät Dateien in das Paket und sagte-Dateien automatisch laufen, ohne zu müssen, Bearbeiten Sie die main-Klasse.
Ist es eine saubere Art und Weise, dies zu tun? Ich dachte, dass vielleicht, wenn ich hatte eine txt-Datei in das Paket mit jeder Unterklasse Namen, es wäre möglich. Geringfügige Unannehmlichkeiten für die Benutzer Bearbeiten die Datei und fügen Sie das neue Gerät den Namen.
Gibt es einen anderen Weg das gleiche Ergebnis zu erzielen? Ich bin daran interessiert, die Bereitstellung einer Möglichkeit für Benutzer, um neues Gerät hinzufügen-Dateien ohne Bearbeitung existierender code.
- Habe ich nicht getestet, aber code.google.com/p/reflections scheint vielversprechend.
- Sie suchen nach einem classpath-scanner, mehrere vorhanden.
- Möchten Sie vielleicht ein SPI.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Reflexion ist eine option, könnte man zuerst alle Klassen, die von den engagierten Paket (Sie finden alle Klassen in einem Paket mit der spiegelung?, Wie alle Klassen-Namen in einem Paket?), dann verwenden:
Gibt es die Java Service Provider Interface. Das ist ein Mechanismus, wo - angesichts einer Schnittstelle findet man alle Instanzen, die diese Schnittstelle implementieren. Voraussetzung für eine Umsetzung-Anbieter, der seine jar enthält eine Datei im META-INF-Unterverzeichnis mit dem Namen der Schnittstelle:
java.lang.Runnable
und als Inhalt eine oder mehrere vollständige Klassennamen.Dies ist mehr oder weniger das, was Sie vorgeschlagen, mit .txt-Datei. Nur Sie können mithilfe von separaten Gläsern.
Könnte man verlangen, dass alle Klassen kommen in Ihrem Glas mit den SPI-Spezifikation. Setzen Sie die Gläser in einem Unterverzeichnis
plugins
und haben, der Pfad als Class-Path in der MANIFEST.MF Ihrem eigenen Glas. Wie Sie wissen, in einem class-path, der neben Gläsern auch Verzeichnisse erlaubt sind.Mehr trickst wird die alternative mit dem Reflexionen Bibliothek. Ich finde, es ist eine Art von Missbrauch, aber es bietet genau das, was Sie wollen, mit etwas Wirkungsgrad Kosten.
Alternativ dazu können Sie verlangen, dass die Klassen sollten kommentierte, so können Sie Scannen alle Klasse Anmerkungen. Ein bisschen Programmieraufwand erforderlich.