2010-11-13 19 views
6

Sto scrivendo una funzionalità in cui sarebbe utile ottenere le classi all'interno di un determinato pacchetto del mio programma. Inoltre, voglio solo le classi che sottoclasse una certa classe.Ottenere i nomi di tutte le classi Java dichiarate in un pacchetto

Ho bisogno delle classi per richiamare metodi statici.

C'è un modo automatico per farlo? Se è così, è lento?

Nel caso in cui non sono stato chiaro, quello che voglio è qualcosa di simile:

ArrayList<Class<? extends MySuperClass>> classes = ; 

classes.add(MyClass.class); 
classes.add(MyClass2.class); 

Invece di dover chiamare aggiungere per ogni classe, vorrei ottenere automaticamente tale elenco di classe.

Il numero di classi è piccolo, quindi non mi dispiacerebbe dichiararle manualmente se il trucco automatico sarebbe lento - questa app è per una piattaforma mobile.

In entrambi i casi, vorrei anche sapere come chiamare il metodo statico per ogni metodo nel ArrayList:

// error The method nameOfStaticMethod is undefined for the type Class<capture#2-of ? extends MySuperClass> 
    classes.get(0).nameOfStaticMethod(); 

Grazie per i vostri commenti.

risposta

2

Java non fornisce questa capacità. Non c'è introspezione a livello di pacchetto. Le classi possono essere record in un database o sull'altro lato di una connessione di rete. Non è necessario che siano archiviati e organizzati in modo da facilitarne l'enumerazione per pacchetto.

È possibile creare un caricatore di classi personalizzato e API per fornire un metodo per elencare i nomi di classe.

+0

Potrebbe yo fornire una descrizione perché questa capacità non è incluso/sarebbe difficile da attuare? –

+0

Le classi possono essere record in un database o sull'altro lato di una connessione di rete. Non è necessario che siano archiviati e organizzati in modo da facilitarne l'enumerazione per pacchetto. – bmargulies

+0

Frummeled il tuo commento nella risposta ("frummeled" è il gergo olandese, che penso dovrebbe essere usato anche in inglese, nel senso che è stato adattato in qualche modo, dopo un sacco di "folletti"). –

1

anch'io vorrei elencare tutte le classi in un pacchetto, ma finora i metodi di fare questo è piuttosto male:

  • Come JOTN suggerito - ha bisogno di accesso ai file - non se si tratta di un vaso
  • elencando una voci jAR - bene, ha bisogno anche il file jar

Citando un older SO domanda:

012.

Non è possibile interrogare un pacchetto per le sue classi (o anche i suoi sotto-pacchetti). http://forums.sun.com/thread.jspa?threadID=341935&start=0&tstart=0 contiene una discussione molto buona sul perché questo è problematico, così come una manciata di soluzioni al tuo problema.

In ogni modo, ecco come si richiama metodi statici della classe:

Method m = Integer.class.getMethod("toString", Integer.TYPE); 
System.out.println(m.invoke(null, 123)); 
+0

+1 Per mostrare come chiamare il metodo statico. – MyNameIsZero

+0

Link purtroppo rotto e dato lo stato del sito Web Oracle in generale, difficile da rintracciare. –

+0

Questo potrebbe essere il collegamento interrotto: https://community.oracle.com/message/7520168#7520168 – tango24

Problemi correlati