2009-09-01 15 views
15

देता है मैं जावा के लिए कुछ नया हूं इसलिए शायद मैं जावा में एनोटेशन के लिए उपयोग के मामलों को गलत समझता हूं। मेरा मुद्दा निम्न है:जावा एनोटेशन क्रिप्टिक क्लास नाम

विधि को एनोटेट करने के बाद मुझे विधि पर एनोटेशन का निरीक्षण करते समय $ Proxy31 जैसे क्लास नाम प्राप्त होते हैं। मुझे उत्सुकता है कि मुझे अपनी एनोटेशन के लिए क्लास नाम क्यों मिल रहे हैं जो इस तरह के हैं, और मैं इस समस्या को ठीक करने के लिए क्या कर सकता हूं।

Method m = this.remoteServiceClass.getMethod(rpcRequest.getMethod().getName()); 
RequiredPermission a = m.getAnnotation(RequiredPermission.class); 

यह एक अशक्त एनोटेशन मैं जानता हूँ कि भले ही उस विधि इसे देख रहा है RequiredPermission एनोटेशन लागू किया है देता है।

for(Annotation a : m.getAnnotations()) 
{ 
    System.out.println(a.getClass().getName()); 
} 

यह $ Proxy31 क्लास नामों को प्रिंट करता है।

+0

कृपया समस्या का प्रदर्शन करने के लिए एक छोटा लेकिन पूरा कार्यक्रम प्रदान करें। कोड के बिना यह जानना मुश्किल है कि क्या हो रहा है। –

+0

रिमोट क्लास में विधि है, या आरपीसीआरक्वेट क्लास एनोटेशन लागू किया गया है? क्या एनोटेशन में रनटाइम प्रतिधारण है और विधि प्रकार पर लागू होता है? (यदि एनोटेशन स्वयं को सही ढंग से एनोटेट नहीं किया गया है, तो आपको त्रुटियां नहीं मिलेंगी, एनोटेशन बस गायब हो गया है)। – Yishai

+0

दूरस्थ सेवा क्लास में विधि है, एनोटेशन में रनटाइम प्रतिधारण और लक्ष्य तत्व प्रकार के तरीके हैं। मैं कक्षा से वास्तविक विधि को पुनः प्राप्त करने के लिए rpcRequest से नाम का उपयोग कर रहा हूं। – bdorry

उत्तर

21

एनोटेशन ए देखते हुए, आपको एनोटेशन प्रकार टाइप करने की आवश्यकता है, एनोटेशन टाइप() नहीं, एनोटेशन के प्रकार को निर्धारित करने के लिए। एक एनोटेशन ऑब्जेक्ट केवल एक प्रॉक्सी है जो उस वर्ग पर एनोटेशन के उस उदाहरण का प्रतिनिधित्व करता है।

Object o = ...; 
Class c = o.getClass(); 
Annotation[] as = c.getAnnotations(); 
for (Annotation a : as) { 
    // prints out the proxy class name 
    System.out.println(a.getClass().getName()); 
    // prints out the name of the actual annotation 
    System.out.println(a.annotationType().getName()); 
} 
+1

(क्योंकि एक एनोटेशन एक इंटरफ़ेस है और इसलिए एक उदाहरण एक ठोस रनटाइम क्लास नहीं हो सकता है।) –

+0

यह गलत है। एक इंटरफ़ेस में अभी भी क्लास ऑब्जेक्ट है जो इसके साथ जुड़ा हुआ है। – Jherico

+1

@ जेरिको, यह सच है, लेकिन वास्तविक रनटाइम इंस्टेंस में इसके getClass() विधि के परिणामस्वरूप एक इंटरफ़ेस नहीं होगा। – Yishai

1

जब आप स्रोत कोड में एनोटेशन जोड़ने, जावा वास्तव में इंटरफेस और "हुड के नीचे" वर्गों में से एक गुच्छा बनाता है आप (या अपने उपकरण) प्रतिबंधों का उपयोग करने टिप्पणियों के बारे में कार्यक्रम बातें पूछने के लिए अनुमति देने के लिए। विधि एनोटेशन "डायनमिक प्रॉक्सी" बनाते हैं, और तदनुसार जावा आपके लिए कक्षाएं बनाता है, शायद प्रॉक्सी नाम के साथ।

आप इस में रुचि रखते हैं, java.lang.reflect.InvocationHandler और उसके उप-प्रकार, AnnotationInvocationHandler

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

@Retention(RetentionPolicy.RUNTIME) 
अपनी एनोटेशन पर

:

1

भी .. इस सेट करने के लिए याद है।

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