2012-10-29 18 views
13

मैं एक सादे जेन servlets वेब अनुप्रयोग है, और मेरे वर्ग के कुछ निम्नलिखित एनोटेशन हैएनोटेशन के लिए कक्षाओं को स्कैन कैसे करें?

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

} 

अब जब मेरे सर्वलेट अनुप्रयोगों शुरू होता है, मैं सभी वर्गों है कि की एक सूची प्राप्त करना चाहते हैं @ नियंत्रक एनोटेशन, और फिर @RequestMapping एनोटेशन का मान प्राप्त करें और उसे एक शब्दकोश में डालें।

मैं यह कैसे कर सकता हूं?

मैं गुइस और गुवा का भी उपयोग कर रहा हूं, लेकिन यह सुनिश्चित नहीं है कि इसमें कोई एनोटेशन संबंधित सहायक है या नहीं।

+0

क्यों आप सीधे एनोटेशन का उपयोग करने की कोशिश कर रहे हैं के लिए साइट https://sites.google.com/site/javacornproject/corn-cps? क्या आप उनके साथ कुछ करने की योजना बना रहे हैं? क्या आप बस उन एनोटेशन के साथ कक्षाओं की एक सूची चाहते हैं? – Robert

+0

मुझे requestmapping का मूल्य प्राप्त करने जा रहा है और उन्हें एक डिकोनरी में डालने जा रहा है। – loyalflow

+1

संभावित डुप्लिकेट [रनटाइम पर जावा एनोटेशन स्कैनिंग] (http://stackoverflow.com/questions/259140/scanning-java-annotations-at-runtime) –

उत्तर

4

एनोटेशन के लिए स्कैनिंग बहुत मुश्किल है। आपको वास्तव में सभी क्लासपाथ स्थानों को संसाधित करना होगा और जावा क्लासेस (* .class) से संबंधित फ़ाइलों को खोजने का प्रयास करना होगा।

मैं दृढ़ता से ऐसे ढांचे का उपयोग करने का सुझाव देता हूं जो ऐसी कार्यक्षमता प्रदान करता है। उदाहरण के लिए आप Scannotation पर एक नज़र डाल सकते हैं।

+1

बहुत मुश्किल ??? मैं कहूंगा कि यह [बहुत सरल] है (http://unixhelp.ed.ac.uk/CGI/man-cgi?find) जब आप क्लासस्पैट (जो आप सामान्य रूप से करते हैं) जानते हैं। लेकिन मैं मानता हूं कि एक अच्छा उपकरण का उपयोग करना एक अच्छा विचार है। – maaartinus

+2

यदि आप इसे कुशलता से करना चाहते हैं तो यह बहुत मुश्किल है। विशेष रूप से यदि आप कक्षा के सभी वर्गों के लिए कक्षा के उदाहरण नहीं बनाना चाहते हैं। – chkal

-1

आप अपने .class फ़ाइलों का उपयोग कर सकते हैं, तो आप नीचे के रूप में वर्ग का उपयोग कर एनोटेशन प्राप्त हो सकता है:

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

भी सुनिश्चित करें, अपनी कक्षाओं RUNTIME

रूप RetentionPolicy के साथ चिह्नित हैं
@Retention(RetentionPolicy.RUNTIME) 
+5

सवाल यह था कि "उन सभी वर्गों की सूची प्राप्त करें जिनके पास @ नियंत्रक एनोटेशन है"। एनोटेशन के लिए अलग-अलग कक्षाओं की जांच करना एक पूरी तरह से अलग बात है। – 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(); 
} 

बेशक एक ही पैकेज में अपने सभी सर्वलेट रखने से यह थोड़ा आसान हो जाता है। इसके अलावा आप उन कक्षाओं को देखना चाहेंगे जिनके पास RequestMapping एनोटेशन है, क्योंकि यह वह है जिसे आप मूल्य प्राप्त करना चाहते हैं।

+0

मैं पैकेज निर्दिष्ट कर सकता हूं, यह कोई समस्या या सीमा नहीं है। – loyalflow

2

कोशिश मक्का-सीपीएस

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> 

यात्रा में अधिक जानकारी के