PDA

Visualizza la versione completa : [Java] Ricerca sottoclassi nel package


dekdek
03-04-2005, 17:44
Ho scritto questo metodo che restituisce un array di Class contenente le classi derivate di Ruota (che e' astratta) presenti nel package "ruote":



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:



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'?

netarrow
03-04-2005, 19:10
forse puņ esserti utile asSubclass (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#asSubclass(java.lang.Class))

:ciauz:

dekdek
03-04-2005, 20:11
Se non ho capito male, praticamente fa questo:



if (Ruota.class.isAssignableFrom(ruota)) // ruota e' assegnabile a Ruota
istanziabili.add(ruota);


solo che lancia un'eccezione se una delle classi non e' sottoclasse di Ruota (e almeno una delle classi del package non lo e'...)
La documentazione e' incomprensibile! :nonlodire

Grazie, cmq! :)

Loading