2012-10-29 14 views
13

Ho un'applicazione web Plain Jane servlet, e alcune delle mie classi hanno le seguenti annotazioni:Come scansionare le classi per le annotazioni?

@Controller 
@RequestMapping(name = "/blog/") 
public class TestController { 
.. 

} 

Ora, quando le mie applicazioni servlet si avvia, vorrei ottenere un elenco di tutte le classi che hanno la @ Annotazione del controller, quindi ottenere il valore dell'annotazione @RequestMapping e inserirlo in un dizionario.

Come posso fare questo?

Anche io sto usando Guice e Guava, ma non sono sicuro se questo abbia qualche aiuto relativo all'annotazione.

+0

Perché si sta tentando di accedere direttamente alle annotazioni? Stai pensando di fare qualcosa con loro? Vuoi semplicemente un elenco delle classi con quelle annotazioni? – Robert

+0

Ho intenzione di ottenere il valore della requestmapping e di inserirli in un dizionario. – loyalflow

+1

possibile duplicato di [Scansione di annotazioni Java in fase di esecuzione] (http://stackoverflow.com/questions/259140/scanning-java-annotations-at-runtime) –

risposta

4

La scansione per le annotazioni è molto difficile. In realtà devi elaborare tutte le posizioni del percorso di classe e cercare di trovare i file che corrispondono alle classi Java (* .class).

Consiglio vivamente di utilizzare un framework che fornisca tale funzionalità. Ad esempio, è possibile dare un'occhiata a Scannotation.

+1

Molto difficile ??? Direi che è [molto semplice] (http://unixhelp.ed.ac.uk/CGI/man-cgi?find) quando conosci CLASSPATH (cosa fai normalmente). Ma sono d'accordo che usare un buon strumento sia una buona idea. – maaartinus

+2

È molto difficile se si vuole farlo in modo efficiente. Soprattutto se non si desidera creare istanze di classe per tutte le classi sul classpath. – chkal

-1

Se è possibile ottenere l'accesso dei vostri file .class, allora si può ottenere l'annotazione utilizzando la classe, come di seguito:

RequestMapping reqMapping = 
         TestController.class.getAnnotation(RequestMapping.class); 
    String name = reqMapping.name(); //now name shoud have value as "/blog/" 

Inoltre si prega di assicurarsi, le tue lezioni sono contrassegnati con RetentionPolicy come RUNTIME

@Retention(RetentionPolicy.RUNTIME) 
+5

La domanda era come "ottenere un elenco di tutte le classi che hanno l'annotazione @Controller". Il controllo delle singole classi per l'annotazione è una cosa completamente diversa. – chkal

35

È possibile utilizzare il Reflections library assegnandogli il pacchetto e l'annotazione che si sta cercando.

Reflections reflections = new Reflections("my.project.prefix"); 
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(Controller.class); 

for (Class<?> controller : annotated) { 
    RequestMapping request = controller.getAnnotation(RequestMapping.class); 
    String mapping = request.name(); 
} 

Naturalmente mettere tutti i tuoi servlet nello stesso pacchetto rende questo un po 'più facile. Potresti anche cercare le classi che hanno l'annotazione RequestMapping, poiché è quella che stai cercando di ottenere un valore.

+0

Posso specificare il pacchetto, non è un problema o una limitazione. – loyalflow

2

Try mais-cps

List<Class<?>> classes = CPScanner.scanClasses(new PackageNameFilter("net.sf.corn.cps.*"),new ClassFilter().appendAnnotation(Controller.class)); 
for(Class<?> clazz: classes){ 
    if(clazz.isAnnotationPresent(RequestMapping.class){ 
    //This is what you want 
    } 
} 

modulo Maven dipendenza:

<dependency> 
    <groupId>net.sf.corn</groupId> 
    <artifactId>corn-cps</artifactId> 
    <version>1.0.1</version> 
</dependency> 

visita il sito per ulteriori informazioni https://sites.google.com/site/javacornproject/corn-cps

Problemi correlati