Alle Klassen eines Packages lesen und instanzieren?

cornholio79

Mitglied
Hallo zusammen,

ich möchte gern in einem Programm Klassen instanzieren ohne diese vorher zu kennen.

Die Idee ist folgende: In einem Package liegen ausschließlich Klassen, die alle das gleiche Interface implementieren. Es sollen ohne Änderungen am bestehenden Code weitere Klassen mit dem Code hinzugefügt, bzw. vorhandene entfernt werden können. Gegeben ist also nur das Package.

Was für meine Idee möglich sein müsste ist, alle Klassen eines Packages abzufragen und dann zu instanzieren. Als Pseudocode stelle ich mir vereinfacht folgendes vor:

Java:
[...]
  Package p = Package.getPackage("de.programm.groups");
  for (int i=0; p.getClasses().size(); i++){
    this.getClass().forName(p.getClasses.get(i)
    myArrayList.add(new p.getClasses().get(i));
  }
[...]

Hoffe das Ziel ist verständlich geworden? Ist das möglich oder Quark?

Danke für eure Unterstützung!

Gruß,
Sascha
 
Hi,

genau sowas hab ich auch mal gesucht. Hab aber leider nichts gefunden und wage auch zu behaupten das das
so nicht geht. Was wohl geht ist: Den Vererbungsbaum "nach oben" durchgehen, d.h. du kannst schauen ob
eine Klasse ein bestimmtes Interface implementiert (Stichwort "Refelction").
 
Ich würde diese Klassen in einer XML Datei spezifizieren oder via DB.

Sowas würde ich vermeiden, da man dann nur per CodeÄnderung eine Klasse vom Laden abhalten kann.

Außerdem kann man dann diese Klassen sinvoll überall im code strukturiert ablegen und macht dann nicht ein riesen pack auf für die Klassen.
 
Hi Leute,

Ich würde diese Klassen in einer XML Datei spezifizieren oder via DB.

Sowas würde ich vermeiden, da man dann nur per CodeÄnderung eine Klasse vom Laden abhalten kann.

Außerdem kann man dann diese Klassen sinvoll überall im code strukturiert ablegen und macht dann nicht ein riesen pack auf für die Klassen.

Mit den Gedanken hast du völlig recht. Hier ist der Hintergrund, dass ich im Laufe einer relativ kurzen Zeit ca. 230 Klassen schreiben werde, die ähnliche Aufgaben lösen werden (Wie Plug-In könnte man sagen). Da will ich mir (und den Kollegen) jegliche "Konfiguration" oder Codeänderung so weit wie irgendmöglich ersparen... Es werden natürlich nicht immer alle instanziert - aber so tief ins Detail wollte ich nicht gehen um nicht von der Fragestellung unnötig abzulenken.

Den Artikel werde ich mir mal ansehen, danke!

Gruß,
Sascha
 
Java Package Objekte kann man nicht nach den enthalten Klassen fragen, da ein Package nur einen Namespace darstellt also nichts darüber aussagt welche Klassen in diesem Namespace liegen und wo sie zu finden sind.
Du könntest das mit EMF modellieren. Das modelierte EPackage kennt alle enthaltenen Klassen und über die erweiterte EMF Reflection API kannst du sie einfach Instanzieren und verwenden.
 
Die Idee ist folgende: In einem Package liegen ausschließlich Klassen, die alle das gleiche Interface implementieren. Es sollen ohne Änderungen am bestehenden Code weitere Klassen mit dem Code hinzugefügt, bzw. vorhandene entfernt werden können. Gegeben ist also nur das Package.

Ich sehe da kein Problem.

Vorgehensweise:

1. Schreib dir eine Methode die dir alle Klassen innerhalb eines Packages auflistet (z.B. so ClassFinder).

2. Prüfe alle Klassen innerhalb des Packages ob sie das Interface XY implementieren. Siehe hierzu Class.isAssignableFrom(...) Class (Java 2 Platform SE v1.4.2).

3. Instanziere deine Klassen. Siehe hierzu Class.newInstance() Class (Java 2 Platform SE v1.4.2).

Fertig.
 
Ja, das entspricht ja im wesentlichen auch dem JavaTip 113 und funktioniert auch ohne Probleme.
 
Hi Leute, danke für eure Antworten.

Ich werde das im Lauf der Woche im Büro testen und melde mich mit dem Ergebnis zurück.

Es ist schade, dass man dabei so einen Workaround implementieren muss. Ich hatte wirklich gehofft man können das über die Reflection-API direkt lösen. Aber so lange es geht bin ich zufrieden 🙂

Dank & Gruß,
Sascha
 

Neue Themen


Zurück
Oben