2011-04-29 21 views
5

मेरे पास 2 जावा एनोटेशन प्रकार हैं, चलो एक्सए और वाईए कहें। दोनों में कुछ विधि है()। मैं स्रोत कोड का विश्लेषण करता हूं और एनोटेशन ऑब्जेक्ट पुनर्प्राप्त करता हूं। अब मैं गतिशीलता को विधि() को कॉल करने में सक्षम होने के लिए वास्तविक प्रकार के एनोटेशन को डालना चाहता हूं। मैं इसे instanceof कथन के बिना कैसे कर सकता हूं? मैं वास्तव में स्विच-जैसे स्रोत से बचना चाहता हूं। मुझे इस तरह कुछ चाहिए:जावा एनोटेशन डायनामिक टाइपकास्ट

Annotation annotation = getAnnotation(); // I recieve the Annotation object here 
String annotationType = annotation.annotationType().getName(); 

?_? myAnnotation = (Class.forName(annotationType)) annotation; 
annotation.method(); // this is what I need, get the method() called 

? _? मतलब है कि मुझे नहीं पता कि मेरा एनाटेशन प्रकार क्या होगा। मैं अपने एक्सए और वाईए एनोटेशन के लिए बेस क्लास का उपयोग नहीं कर सकता क्योंकि एनोटेशन में विरासत की अनुमति नहीं है। या किसी भी तरह से करना संभव है?

किसी भी सुझाव या सहायता के लिए धन्यवाद।

Annotation annotation = getAnnotation(); 
Class<? extends Annotation> annotationType = annotation.annotationType(); 
Object result = annotationType.getMethod("method").invoke(annotation); 

यह दृष्टिकोण काफी जोखिम भरा है और पूरी तरह से कोड रिफैक्टरिंग समझौता अगर जरूरत:

उत्तर

6

आप अपनी एनोटेशन पुनर्प्राप्त करने के लिए टाइपएफ़ तरीके का उपयोग क्यों नहीं करते?

final YourAnnotationType annotation = classType.getAnnotation(YourAnnotationType.class); 
annotation.yourMethod(); 

यदि आपकी एनोटेशन नहीं मिल पाती है, तो शून्य वापस आती है।

कृपया ध्यान दें कि यह फ़ील्ड और विधियों के साथ भी काम करता है।

+0

यह विधियों और क्षेत्रों के साथ भी काम करता है। –

+1

यह मेरी समस्या का समाधान नहीं करता है। मुझे उपयोग करने वाले प्रत्येक MyAnnotationType के लिए इस पंक्ति को घोषित करने की आवश्यकता है। classType.getAnnotation (YourAnnotationType.class); तो यह फिर से स्विच की तरह दिखता है। –

5

एक तरीका यह विधि गतिशील यह के नाम का उपयोग आह्वान करने के लिए है।

+0

बढ़िया काम करता है! जिस तरह से मुझे '@ टेबल' एनोटेशन से नाम विशेषता मिल रही थी, कुछ सरल रेगेक्स का उपयोग करके 'annotation.toSring()' से तालिका नाम निकालने के द्वारा, लेकिन आपका समाधान अधिक सुरुचिपूर्ण है। –

संबंधित मुद्दे