2015-06-12 16 views
5

Come posso ottenere tutte le classi usando un modello come "com.stackoverflow. *" Con Javassist?Come ottenere tutte le classi con Javassist usando un pattern

ho trovato solo 2 metodi:

1/trovare una classe in base al nome completo

CtClass ClassPool.getDefault().getCtClass("com.stackoverflow.user.name") 

2/Trova un elenco delle classi con fullnames:

CtClass[] ClassPool.getDefault().get(String [] arg0) 

risposta

3

Si potrebbe usare un po ' libreria come: https://github.com/ronmamo/reflections

Io non dimagrisco puoi farlo solo con le lezioni di JRE.

Esempio dal doc:

Reflections reflections = new Reflections("my.project.prefix"); 

Set<Class<? extends SomeType>> subTypes = 
      reflections.getSubTypesOf(SomeType.class); 

Set<Class<?>> annotated = 
      reflections.getTypesAnnotatedWith(SomeAnnotation.class); 
+1

Grazie ma voglio farlo con la libreria javassist se possibile – user1335838

3

s' Michael Laffargue suggerimento è il modo migliore per andare. La libreria Reflections utilizza javassist sotto le copertine. Fondamentalmente, javassist fornisce un mezzo per leggere codice byte grezzo da file di classe o jar ed estrarre i meta-dati di classe da esso senza effettivamente caricare la classe, dove Reflections fornisce un'API più ricca intorno alla localizzazione (tramite specifiche del classpath) e filtrando il set di classi che stai cercando.

Si può fare la stessa cosa da soli usando solo javassist, ma si creerà una parte della libreria di Reflections. Si poteva guardare il codice sorgente di Reflections' per vedere come funziona, ma molto in generale, sembra che questo:

  1. Individuare il percorso di classe che si desidera eseguire la scansione. Questo di solito sarà un gruppo di directory con un albero di file di classe o un gruppo di file Jar, ma potrebbe anche includere strutture più complesse come WAR o EAR (che Reflections supporta abbastanza bene).

  2. Aggiungere la radice del file system in cui risiedono i file di classe o il riferimento del file JAR all'istanza ClassPool.

  3. Utilizzando un'iterazione di file system o JarInputStream, scorrere ogni file di classe o JarEntry. È possibile filtrare tutti i file o le voci che non corrispondono a "com/stackoverflow/**. Class"
  4. Per il rimanente, utilizzando il nome del file o della voce, deselezionare il nome della classe e caricarlo dal pool di classi javassist .
  5. Utilizzare il CtClass caricato per applicare ulteriori criteri di ricerca.
  6. Ora avete la vostra lista di riferimento di classe, rilasciate ClassPool per garbage collection.
Problemi correlati