मेरे पास 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);
यह दृष्टिकोण काफी जोखिम भरा है और पूरी तरह से कोड रिफैक्टरिंग समझौता अगर जरूरत:
यह विधियों और क्षेत्रों के साथ भी काम करता है। –
यह मेरी समस्या का समाधान नहीं करता है। मुझे उपयोग करने वाले प्रत्येक MyAnnotationType के लिए इस पंक्ति को घोषित करने की आवश्यकता है। classType.getAnnotation (YourAnnotationType.class); तो यह फिर से स्विच की तरह दिखता है। –