2008-08-23 13 views
104

जावा में एनोटेशन का उद्देश्य क्या है? मेरे पास एक टिप्पणी और वास्तविक कोड के बीच कहीं भी यह अस्पष्ट विचार है। क्या वे रन टाइम पर कार्यक्रम को प्रभावित करते हैं?जावा एनोटेशन

उनके सामान्य उपयोग क्या हैं?

क्या वे जावा के लिए अद्वितीय हैं? क्या कोई सी ++ बराबर है?

+9

पर आप स्वच्छ और केंद्रित हैं, आप एनोटेशन के साथ कुछ वाकई दुष्ट चीजें कर सकते हैं। उदाहरण के लिए, यदि आप स्प्रिंग फ्रेमवर्क और उनके @ ट्रान्सैक्शनल एनोटेशन को जानते हैं जो अपवाद/त्रुटि पर विधि आमंत्रण और रोलबैक से पहले एक लेनदेन शुरू करता है और सफल लेनदेन पर चलता है। यह पूरी तरह से एसओसी-सिद्धांत (चिंता का पृथक्करण) का समर्थन करता है। बहुत साफ ! जावा नियम! :-) –

+1

यह मेरे लिए 3 प्रश्नों की तरह दिखता है। दूसरा खुद में बहुत व्यापक है। – Raedwald

+0

वाक्यविन्यास द्वारा सभी टिप्पणियां इंटरफेस की तरह दिखती हैं। तो, कंपाइलर या जेवीएम कैसे अपना उद्देश्य जानता है? मान लीजिए कि क्या हम @ ओवरराइड लेते हैं -> ऊपर बताए गए अनुसार, विधि को ओवरराइड ठीक से या @ लेनदेन संबंधी पर जांच करता है, यह लेनदेन से संबंधित सामान करता है। इन सभी टिप्पणियों के लिए, हमें परिभाषा/तर्क कहां मिल सकता है? –

उत्तर

74

एनोटेशन मुख्य रूप से कोड द्वारा उपयोग किया जाता है जो अन्य कोड का निरीक्षण कर रहा है। इन्हें अक्सर अपने व्यवहार को बदलने के लिए रन-टाइम पर मौजूदा कक्षाओं को संशोधित करने के लिए उपयोग किया जाता है (यानी सजावट या लपेटना)। फ्रेमवर्क जैसे JUnit और Hibernate फ्रेमवर्क का उपयोग करने के लिए आपको लिखने के लिए आवश्यक कोड की मात्रा को कम करने के लिए एनोटेशन का उपयोग करें।

ओरेकल की साइट पर a good explanation of the concept and its meaning in Java है।

16

इसके अलावा, वे जावा के लिए अद्वितीय हैं, वहाँ एक सी ++ बराबर है?

नहीं, लेकिन वीबी और सी # attributes है जो एक ही बात है।

उनका उपयोग काफी विविध है। एक सामान्य जावा उदाहरण, @Override कोड पर कोई प्रभाव नहीं पड़ता है लेकिन अगर संकलित विधि वास्तव में किसी अन्य विधि को ओवरराइड नहीं करती है तो इसे संकलक (या त्रुटि) उत्पन्न करने के लिए कंपाइलर द्वारा उपयोग किया जा सकता है। इसी तरह, विधियों को अप्रचलित चिह्नित किया जा सकता है।

फिर प्रतिबिंब है। जब आप अपने कोड में किसी प्रकार की कक्षा को प्रतिबिंबित करते हैं, तो आप गुणों तक पहुंच सकते हैं और वहां मिली जानकारी के अनुसार कार्य कर सकते हैं। मुझे जावा में कोई उदाहरण नहीं पता है लेकिन .NET में इसका उपयोग कक्षाओं के लिए (de)serialization जानकारी उत्पन्न करने के लिए कंपाइलर द्वारा किया जाता है, संरचनाओं के memory layout और विरासत पुस्तकालयों (दूसरों के बीच) से declare function imports निर्धारित करें। वे यह भी नियंत्रित करते हैं कि आईडीई फॉर्म डिज़ाइनर कैसे काम करता है।

/संपादित करें: कक्षाओं पर गुण टैग इंटरफेस के लिए तुलनीय हैं (जैसे जावा में Serializable)। हालांकि, .NET कोडिंग दिशानिर्देशों का कहना है कि टैग इंटरफेस का उपयोग न करें। साथ ही, वे केवल स्तर स्तर पर काम करते हैं, विधि स्तर पर नहीं।

12

ऐन्डर्स एक अच्छा सारांश देता है, और यहाँ है एक JUnit एनोटेशन

@Test(expected=IOException.class) 
public void flatfileMissing() throws IOException { 
    readFlatFile("testfiles"+separator+"flatfile_doesnotexist.dat"); 
} 

यहाँ @Test एनोटेशन JUnit कह रहा है का एक उदाहरण है कि flatfileMissing विधि एक परीक्षण है कि मार डाला जाना चाहिए और अपेक्षित परिणाम एक है IOException फेंक दिया। इस प्रकार, जब आप अपने परीक्षण चलाते हैं, तो इस विधि को बुलाया जाएगा और परीक्षण IOException फेंक दिया गया है या नहीं, इस पर आधारित होगा।

7

जावा में एनोटेशन प्रोसेसिंग टूल (एपीटी) भी है जहां न केवल आप एनोटेशन बनाते हैं, बल्कि यह भी तय करते हैं कि इन एनोटेशन स्रोत कोड पर कैसे काम करते हैं।

Here एक परिचय है।

4

एनोटेशन के साथ आप कुछ अच्छी चीजें देखने के लिए देख सकते हैं, my JavaBean annotations and annotation processor देखें।

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

0

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

विस्तार से पढ़ने के लिए, वहाँ है Java Annotations

0

When do you use Java's @Override annotation and why? लिंक जब एक ओवरराइड एनोटेशन (@override) का उपयोग करना चाहिए पर एक प्रश्न को संदर्भित करता है पर एक अच्छी ट्यूटोरियल .. यह की अवधारणा को समझने मदद कर सकता है एनोटेशन बेहतर। जांच लें।

0

ईजेबी की बात होने पर एनोटेशन को एक स्पष्ट मध्यम-वेयर दृष्टिकोण पर लागू मध्य-वेयर दृष्टिकोण चुनने के रूप में जाना जाता है, जब आप एनोटेशन का उपयोग करते हैं तो आप एपीआई से आपको जो चाहिए उसे अनुकूलित कर रहे हैं उदाहरण के लिए आपको लेनदेन कॉल करने की आवश्यकता है एक बैंक स्थानांतरण के लिए विधि: एनोटेशन का उपयोग किए बिना: कोड

transfer(Account account1, Account account2, long amount)  
{ 
    // 1: Call middleware API to perform a security check 
    // 2: Call middleware API to start a transaction 
    // 3: Call middleware API to load rows from the database 
    // 4: Subtract the balance from one account, add to the other 
    // 5: Call middleware API to store rows in the database 
    // 6: Call middleware API to end the transaction 
} 

एनोटेशन का उपयोग करते समय अपने कोड नहीं बोझिल एपीआई मध्यम बर्तन सेवाओं का उपयोग करने के लिए कॉल शामिल किया जाएगा। कोड व्यापार तर्क

transfer(Account account1, Account account2, long amount) 
{ 
    // 1: Subtract the balance from one account, add to the other 
} 
संबंधित मुद्दे