# Alle Klassen eines Packages lesen und instanzieren?



## cornholio79 (11. Sep 2010)

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:


```
[...]
  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


----------



## gman (11. Sep 2010)

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").


----------



## Marcinek (11. Sep 2010)

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.


----------



## Gast2 (11. Sep 2010)

Du kannst es über die Class Files lösen:

Java Tip 113: Identify subclasses at runtime - JavaWorld


----------



## cornholio79 (12. Sep 2010)

Hi Leute,



Marcinek hat gesagt.:


> 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


----------



## Wildcard (12. Sep 2010)

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.


----------



## LoR (12. Sep 2010)

cornholio79 hat gesagt.:


> 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.


----------



## Gast2 (12. Sep 2010)

Ja, das entspricht ja im wesentlichen auch dem JavaTip 113 und funktioniert auch ohne Probleme.


----------



## cornholio79 (12. Sep 2010)

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


----------



## cornholio79 (13. Sep 2010)

Hallo zusammen,

ich habe es jetzt mit dem ClassFinder probiert und es klappt hervorragend!!!

1.000 Dank für den super Tip! 

Gruß,
Sascha


----------

