Hallo
Ich versuche aus einem Verzeichniss alle Klassen auszulesen die ein bestimmtes Interface implementieren in eine Liste zu speichern. Hierbei geht es um das Interface "MapGenerator". Ich hab dann erstmal eine Liste erstellt bzw. in meinem Fall eine Map.
Nun durchlaufe ich mein Verzeichnis mit File.listFiles() und so und lasse mir mit ClassLoader.loadFrom(...) die Klasse laden und zurückgeben. Von diesem Objekt ruf ich Class.getInterfaces() auf und gucke ob mein Interface dabei ist. Wenn ja will ich diese Klasse in meine Map speichern. Jedoch klappt das nicht ohne eine Warnung.
Wobei "tmp" das Class-Objekt von ClassLoader.loadFrom(). Je nach dem wie ich es versuche zu casten, entweder direkt oder ich lasse die Map.put() Methode casten, erhalte ich diese Warnung. Wie krieg ich nun sauber die Variable tmp nach Class<? extends MapGenerator> gecastet? Ich bin dabei auf Class.cast() gestoßen, jedoch weiß ich nicht wie ich ein Objekt vom Typ Class<? extends MapGenerator> erstelle. Oder gibt es vielleicht einen eleganteren weg?
Hier mein bisheriger Code
Ich versuche aus einem Verzeichniss alle Klassen auszulesen die ein bestimmtes Interface implementieren in eine Liste zu speichern. Hierbei geht es um das Interface "MapGenerator". Ich hab dann erstmal eine Liste erstellt bzw. in meinem Fall eine Map.
Code:
Map<String, Class<? extends MapGenerator>> foobar;
Nun durchlaufe ich mein Verzeichnis mit File.listFiles() und so und lasse mir mit ClassLoader.loadFrom(...) die Klasse laden und zurückgeben. Von diesem Objekt ruf ich Class.getInterfaces() auf und gucke ob mein Interface dabei ist. Wenn ja will ich diese Klasse in meine Map speichern. Jedoch klappt das nicht ohne eine Warnung.
Code:
net/sourceforge/structor/MapFactory.java:83: warning: [unchecked] unchecked cast
found : java.lang.Class
required: java.lang.Class<? extends net.sourceforge.structor.MapGenerator>
System.out.println((Class<? extends MapGenerator>)tmp);
^
net/sourceforge/structor/MapFactory.java:84: warning: [unchecked] unchecked conversion
found : java.lang.Class
required: java.lang.Class<? extends net.sourceforge.structor.MapGenerator>
this.generators.put("foobar", tmp);
Hier mein bisheriger Code
Code:
public MapFactory() {
this.generators = new HashMap<String, Class<? extends MapGenerator>>();
File f = new File("net/sourceforge/structor");
if (!f.exists() || !f.isDirectory()) {
throw new RuntimeException("directory net/sourceforge/structor/ doesn't exists.");
}
File[] files = f.listFiles();
for (int i=0; i<files.length; i++) {
if (!files[i].canRead()) {
continue;
}
if (!files[i].getName().endsWith(".java")) {
continue;
}
String classname = files[i].getName().replaceAll("\\.java$", "");
Class tmp = null;
try {
// tmp can be every class
tmp = ClassLoader.getSystemClassLoader().loadClass("net.sourceforge.structor."+classname);
} catch (ClassNotFoundException e) {
System.out.println(e);
System.exit(16);
}
Class[] interfaces = tmp.getInterfaces();
boolean found = false;
for (int j=0; j<interfaces.length; j++) {
if (interfaces[j].equals(MapGenerator.class)) {
found = true;
break;
}
}
if (found) {
// "tmp" is a valid class of MapGenerator, save it.
System.out.println("loaded Map Generator "+tmp);
System.out.println(tmp);
System.out.println(tmp.getClass());
System.out.println("-: "+MapGenerator.class);
//System.out.println((MapGenerator.class).cast(tmp));
System.out.println((Class<? extends MapGenerator>)tmp);
this.generators.put("foobar", tmp);
// this.generators.put(((MapGenerator)tmp.newInstance()).getType(), tmp);
}
}
}