2012-10-29 36 views
13

我有一個素雅servlet爲Web應用程序,以及一些我的班有以下注釋:如何掃描註解的類?

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

} 

現在,當我的servlet應用程序啓動時,我想獲得具有的所有類的列表@ Controller批註,然後獲取@RequestMapping批註的值並將其插入字典中。

我該怎麼做?

我也使用Guice和番石榴,但不知道是否有任何註釋相關的幫助。

+0

你爲什麼試圖直接訪問註釋網站https://sites.google.com/site/javacornproject/corn-cps?你打算跟他們做點什麼嗎?你只是想要一個帶有這些註釋的類的列表? – Robert

+0

我將獲取請求映射的值並將它們插入到dicionary中。 – loyalflow

+1

[在運行時掃描Java註釋]的可能重複(http://stackoverflow.com/questions/259140/scanning-java-annotations-at-runtime) –

回答

4

掃描註釋非常困難。您實際上必須處理所有類路徑位置,並嘗試查找與Java類(* .class)相對應的文件。

我強烈建議使用提供此類功能的框架。你可以看看Scannotation

+1

非常困難?當你知道你CLASSPATH時(你通常會這麼做),我會說[非常簡單](http://unixhelp.ed.ac.uk/CGI/man-cgi?find)。但我同意使用一個好的工具是一個好主意。 – maaartinus

+2

如果你想有效地做到這一點非常困難。特別是如果您不想爲類路徑中的所有類創建Class實例。 – chkal

-1

如果你能得到你的.class文件的訪問權限,那麼您可以使用下面的類得到了註解:

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

同時請確保您的類標有RetentionPolicyRUNTIME

@Retention(RetentionPolicy.RUNTIME) 
+5

問題是如何「獲取所有具有@Controller批註的類的列表」。檢查單個類的註釋是完全不同的事情。 – chkal

35

您可以使用Reflections library,併爲其提供所需的包裝和註解。

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

當然,將所有的servlet放在同一個軟件包中,這樣會更容易一些。此外,您也可能希望查找具有RequestMapping註釋的類,因爲這是您希望從中獲得價值的類。

+0

我可以指定包裝,這不是問題或限制。 – loyalflow

2

嘗試玉米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的模塊依賴:

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

訪問以獲取更多信息