Ho scritto questo metodo che restituisce un array di Class contenente le classi derivate di Ruota (che e' astratta) presenti nel package "ruote":
codice:
public final static Class[] getRuote() {
String pacchetto = Ruota.class.getPackage().getName(); // Nome pacchetto
String path = Ruota.class.getResource(".").getFile(); // Directory della classe root
File dir = new File(path); // Trasforma in File
File[] classi = dir.listFiles(); // Leggi tutti i File nella directory
ArrayList<Class> istanziabili = new ArrayList<Class>(classi.length);
Class ruota=null;
for (File f : classi) {
String r = pacchetto + '.' + f.getName();
try {
ruota = Class.forName(r.replaceFirst(".class",""));
} catch (Throwable t) {}
if (Modifier.isAbstract(ruota.getModifiers()))
continue;
if (Ruota.class.isAssignableFrom(ruota)) // ruota e' assegnabile a Ruota
istanziabili.add(ruota);
}
Class[] lista = new Class[istanziabili.size()];
lista = istanziabili.toArray(lista);
return lista;
}
Si accettano commenti, insulti, ortaggi...
Una cosa che non mi va giu' e' il dovermi riferire esplicitamente a Ruota qui:
codice:
if (Ruota.class.isAssignableFrom(ruota)) // ruota e' assegnabile a Ruota
In pratica manca un equivalente statico del this. Avevo letto che nella JDK 1.5 sarebbe stato reso statico lo stesso this, invece nisba...
Cmq, facezie a parte, ho scritto un sacco di codice inutile e c'e' un metodo piu' semplice per fare tutto cio'?