2012-10-29 6 views
13

Ich habe eine einfache Jane-Web-Anwendung Servlets und einige meiner Klassen folgende Anmerkungen haben:Wie scannt man Klassen für Annotationen?

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

} 

Nun, wenn meine Servlet-Anwendungen startet, würde Ich mag eine Liste aller Klassen erhalten, die die haben @ Controller-Annotation und dann den Wert der Annotation @RequestMapping abrufen und in ein Dictionary einfügen.

Wie kann ich das tun?

Ich benutze Guice und Guava auch, aber nicht sicher, ob das irgendwelche Annotationshelfer hat.

+0

Warum versuchen Sie die Anmerkungen direkt zugreifen? Planen Sie etwas mit ihnen zu machen? Willst du nur eine Liste der Klassen mit diesen Anmerkungen? – Robert

+0

Ich werde den Wert der Anforderungsmapping erhalten und sie in ein Dictionary einfügen. – loyalflow

+1

mögliches Duplikat von [Java-Anmerkungen zur Laufzeit scannen] (http://stackoverflow.com/questions/259140/scanning-java-annotations-a-run-time) –

Antwort

4

Das Scannen nach Anmerkungen ist sehr schwierig. Sie müssen tatsächlich alle Klassenpfadpositionen verarbeiten und versuchen, Dateien zu finden, die Java-Klassen (* .class) entsprechen.

Ich empfehle dringend, ein Framework zu verwenden, das solche Funktionalität bietet. Sie könnten zum Beispiel einen Blick auf Scannotation werfen.

+1

Sehr schwierig ??? Ich würde sagen, es ist [sehr einfach] (http://unixhelp.ed.ac.uk/CGI/man-cgi?find), wenn Sie CLASSPATH kennen (was Sie normalerweise tun). Aber ich stimme zu, dass die Verwendung eines guten Werkzeugs eine gute Idee ist. – maaartinus

+2

Es ist sehr schwierig, wenn Sie es effizient machen wollen. Vor allem, wenn Sie keine Klasseninstanzen für alle Klassen im Klassenpfad erstellen möchten. – chkal

-1

Wenn Sie den Zugriff Ihrer Class-Dateien bekommen können, dann die Anmerkung mit der Klasse, die Sie kann als unten:

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

Auch stellen Sie bitte sicher, Ihre Klassen mit RetentionPolicy als RUNTIME markiert

@Retention(RetentionPolicy.RUNTIME) 
+5

Die Frage war, wie man "eine Liste aller Klassen bekommt, die die @Controller Annotation haben". Das Überprüfen einzelner Klassen für die Annotation ist eine ganz andere Sache. – chkal

35

Sie können das Reflections library verwenden, indem Sie ihm das Paket und die Annotation geben, die Sie suchen.

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(); 
} 

Natürlich ist es etwas einfacher, alle Servlets in ein und demselben Paket zu platzieren. Möglicherweise möchten Sie auch nach den Klassen suchen, die die Annotation RequestMapping haben, da dies der Wert ist, von dem Sie einen Wert erhalten möchten.

+0

Ich kann das Paket angeben, das ist kein Problem oder eine Einschränkung. – 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 
    } 
} 

Maven Modul Abhängigkeit:

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

Besuch der Website https://sites.google.com/site/javacornproject/corn-cps für weitere Informationen