Hallo,
sorry, dass ich mich erst jetzt dazu melde... ging net früher. Also, wozu ich das brauche ist folgendes:
Ich schreibe ein Programm, indem ich mit Zahlen jongliere. Die Verarbeitungs-Methode, mit der die Zahlen jongliert werden, soll als Parameter (derzeit noch ein Consolen-Programm) übergeben werden. Der Wert dieses Parameters ist gleich dem Namen der Klasse, in der die entsprechende Verarbeitungsmethode drin ist. Alle diese Klassen implementieren ein bestimmtes Interface, was den ganzen Krempel einfacher macht. Ich kann dann die Klasse mit Class.forName(parameterwert) und einem getInstance() laden.
Gibt der dumme User aber nun einen unbekannten Wert für diesen Parameter ein (es wird also eine ClassNotFoundException ausgelöst) soll ein Hilfetext erscheinen. In diesem Hilfetext sollen alle derzeitig vorhandenen Verarbeitungsmethoden (bzw. deren Klassennamen) aufgelistet werden. Und diese Liste will ich halt dynamisch generieren, was es erforderlich macht, das Package, indem sich diese Verarbeitungs-Klassen befinden, zu durchsuchen...
Jetzt habich mal irgendwo aufgeschnappt, dass Package-Hierarchie nicht unbedingt immer gleich Verzeichnishierarchie sein muss, was mich allerdings ziemlich irritiert
Hoffe, das war halbwegs klar erläutert ^^
THX in advance
M.
EDIT: Ich habs bisher so umgesetzt. Setzt aber voraus, dass Pakethierarchie = Verzeichnishierarchie ist. Es wird zusätzlich geprüft, ob die geladenen Klassen das Interface Metrics implementieren. Am Ende bekomme ich ein Metrics[] zurück mit dem ich diese Hilfe-Liste erzeugen kann (brauche dazu die Metrics Objekte, weil innerhalb der jeweiligen Klassen noch der korrekt ausgeschriebene Name dieser Metrik ist.
Code:
public static Metrics[] loadAllMetrics() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
ArrayList arr = new ArrayList();
String fs = System.getProperty(file.separator);
String ps = .;
String dirName = de+fs+com+fs+mbmmbu+fs+scoreCalculator+fs+metrics;
String pckName = de+ps+com+ps+mbmmbu+ps+scoreCalculator+ps+metrics;
Class metricsInterface = Class.forName(pckName+.Metrics);
File dir = new File(dirName);
if(dir.isDirectory()) {
File[] files = dir.listFiles(new ClassFileFilter());
for(int i=0; i<files.length; i++) {
String s = files[i].getName();
s = s.substring(0, s.lastIndexOf(.));
s = pckName+.+s;
Class tmp = Class.forName(s);
Class[] interfaces = tmp.getInterfaces();
if(interfaces.length>0) {
boolean implementsMetrics = false;
for(int k=0; k<interfaces.length && implementsMetrics==false; k++) {
if(interfaces[k].equals(metricsInterface)) {
implementsMetrics=true;
arr.add((Metrics)tmp.newInstance());
}
}
}
}
}
Metrics[] aMetrics = new Metrics[arr.size()];
for(int i=0; i<arr.size(); i++) aMetrics[i]=(Metrics)arr.get(i);
return aMetrics;
}
Aber irgendwie gefällt mir das alles nicht. ^^ hab auch das gefühl, dass ich da zu vorsichtig bin und alles mögliche abfrage, was evtl. gar nciht notwendig ist.