लेख शुरुआती लोगों पर अधिक केंद्रित है, या जिन्होंने अभी तक भाषा में इस तंत्र के साथ काम नहीं किया है। मैं आपको यह बताने की कोशिश करूंगा कि यह क्या है, उनकी आवश्यकता क्यों है, और आप कैसे एनोटेशन बना सकते हैं जो आपके लिए सुविधाजनक हैं।
एनोटेशन ऐसे डिस्क्रिप्टर होते हैं जो प्रोग्राम टेक्स्ट में शामिल होते हैं और प्रोग्राम जीवन चक्र के विभिन्न चरणों में आवश्यक प्रोग्राम कोड के मेटाडेटा को स्टोर करने के लिए उपयोग किए जाते हैं।
एनोटेशन में संग्रहीत जानकारी का उपयोग उचित हैंडलर द्वारा आवश्यक सहायक फ़ाइलों को बनाने या कक्षाओं, फ़ील्ड्स आदि को चिह्नित करने के लिए किया जा सकता है।
वाक्य-विन्यास
एनोटेशन को संबंधित इंटरफ़ेस के विवरण द्वारा परिभाषित किया गया है।
उदाहरण के लिए, इस तरह:
import java.lang.annotation.*; @Target(value=ElementType.FIELD) @Retention(value= RetentionPolicy.RUNTIME) public @interface Name { String name(); String type() default “string”; }
जैसा कि आप ऊपर दिए गए उदाहरण से देख सकते हैं, एनोटेशन को
इंटरफ़ेस कीवर्ड के साथ विवरण द्वारा परिभाषित किया गया है और इसमें कई फ़ील्ड शामिल किए जा सकते हैं जिन्हें या तो अनिवार्य या वैकल्पिक सेट किया जा सकता है। उत्तरार्द्ध मामले में, फ़ील्ड का डिफ़ॉल्ट मान प्रतिस्थापित किया जाता है।
इसे उदाहरण से भी देखा जा सकता है कि एनोटेशन को स्वयं कई एनोटेशन के साथ चिह्नित किया जा सकता है।
आइए शुरू करते हैं कि कैसे अपने स्वयं के एनोटेशन को चिह्नित करें, और क्यों।
@ रिटेंशन एनोटेशन आपको एनोटेशन के जीवन चक्र को निर्दिष्ट करने की अनुमति देता है: यह केवल स्रोत कोड में, संकलित फ़ाइल में मौजूद होगा, या यह रनटाइम पर भी दिखाई देगा। आपकी ज़रूरत के प्रकार का चुनाव इस बात पर निर्भर करता है कि आप एनोटेशन का उपयोग कैसे करना चाहते हैं, उदाहरण के लिए, स्रोत कोड से कुछ माध्यमिक उत्पन्न करें या निष्पादन की प्रक्रिया में, प्रतिबिंब के माध्यम से कक्षा में दस्तक दें।
@Target एनोटेशन इंगित करता है कि वास्तव में हम इस एनोटेशन के साथ क्या चिह्नित कर सकते हैं, यह फ़ील्ड, विधि, प्रकार आदि हो सकता है।
@Documented एनोटेशन इंगित करता है कि चिह्नित एनोटेशन को फ़ील्ड / विधि, आदि के javadoc में जोड़ा जाना चाहिए।
उदाहरण के लिए, @Documented के बिना एनोटेशन के साथ चिह्नित एक वर्ग इस तरह दिखेगा:
public class TestClass extends java.lang.Object
और यदि आप एनोटेशन के विवरण में @Documented जोड़ते हैं, तो हमें मिलता है:
@ControlledObject(name="name") public class TestClass extends java.lang.Object
@ इनहेरिटेड एनोटेशन एक एनोटेशन चिह्नित करता है जो उस एनोटेशन के साथ चिह्नित वर्ग के वंशज को विरासत में मिलेगा।
आइए एक उदाहरण के रूप में कुछ टिप्पणी करें और उन्हें एक वर्ग के साथ चिह्नित करें।
@Inherited @interface PublicAnnotate { } @interface PrivateAnnotate { } @PublicAnnotate @PrivateAnnotate class ParentClass { } class ChildClass extends ParentClass { }
चाइल्डक्लास क्लास को पैरेंट क्लास से पब्लिकऑनोटेट एनोटेशन ही मिलेगा।
आपके एनोटेशन का एक उदाहरण।
अब एनोटेशन का उपयोग करके एक काम करने वाला उदाहरण लिखने की कोशिश करते हैं।
कल्पना करें कि हमारे पास कुछ प्रकार की घर-निर्मित परियोजना है जो एक वर्ग प्राप्त करता है जो विशेष रूप से इनपुट के लिए एनोटाइज़ किया जाता है ताकि परियोजना इस वर्ग की वस्तुओं के जीवन चक्र का प्रबंधन कर सके, और कक्षा के तरीकों का वर्णन करने के लिए StartObject, StopObject एनोटेशन हो और खुद को वर्णित करने के लिए नियंत्रित करें। वर्ग। हम अंतिम एनोटेशन को नाम फ़ील्ड देंगे, खोज के लिए वहाँ का नाम माना जाता है।
एनोटेशन इस तरह दिखेगा:
@Target(value=ElementType.METHOD) @Retention(value= RetentionPolicy.RUNTIME) public @interface StartObject { } @Target(value=ElementType.METHOD) @Retention(value= RetentionPolicy.RUNTIME) public @interface StopObject { } @Target(value=ElementType.TYPE) @Retention(value= RetentionPolicy.RUNTIME) public @interface ControlledObject { String name(); }
हम एक मॉड्यूल लिखेंगे जो यह जांचता है कि कक्षा हमारी काल्पनिक परियोजना में लोड करने के लिए उपयुक्त है या नहीं।
सबसे पहले, हम परीक्षण किए गए वर्ग को ही परिभाषित करते हैं।
@ControlledObject(name="biscuits") public class Cookies { @StartObject public void createCookie(){
कक्षा के साथ काम करने के लिए, आपको पहले कक्षा को आवेदन के संदर्भ में लोड करना होगा। हम उपयोग करते हैं:
Class cl = Class.forName("org.annotate.test.classes.Cookies");
इसके अलावा, परावर्तन तंत्र के माध्यम से, हम कक्षा के क्षेत्र और एनोटेशन तक पहुँच प्राप्त करते हैं।
कक्षा में एनोटेट तरीकों की जाँच करें और क्लास पर ही एनोटेशन करें:
if(!cl.isAnnotationPresent(ControlledObject.class)){ System.err.println("no annotation"); } else { System.out.println("class annotated ; name - " + cl.getAnnotation(ControlledObject.class)); } boolean hasStart=false; boolean hasStop=false; Method[] method = cl.getMethods(); for(Method md: method){ if(md.isAnnotationPresent(StartObject.class)) {hasStart=true;} if(md.isAnnotationPresent(StopObject.class)) {hasStop=true;} if(hasStart && hasStop){break;} } System.out.println("Start annotaton - " + hasStart + "; Stop annotation - " + hasStop );
हम इसे प्राप्त उत्पादन पर चल रहा है:
एनोटेटन शुरू करें - सच; एनोटेशन बंद करो - सच।
यदि आप किसी एनोटेशन को हटाने का प्रयास करते हैं, तो आउटपुट आवश्यकताओं के साथ गैर-अनुपालन की रिपोर्ट करेगा।
परिणाम
मुझे उम्मीद है कि मैं यह दिखाने में सक्षम था कि एनोटेशन प्रोग्राम कोड के साथ काम करने के लिए पर्याप्त अवसर प्रदान करते हैं, और यह न केवल मानक भाषा एनोटेशन का उपयोग करने के लिए समझ में आता है, बल्कि आपकी आवश्यकताओं को पूरा करने के लिए एनोटेशन बनाकर जीवन को आसान बनाने के लिए भी है।
मैं
के। एस। होर्स्टमन, गैरी कॉर्नेल , या ओरेकल वेबसाइट पर, जहाँ विस्तृत ट्यूटोरियल भी हैं,
"मैक 2. प्रोफेशनल लाइब्रेरी, वॉल्यूम 2. प्रोग्रामिंग सबलेटिज़" इस तंत्र पर अधिक विवरण की सिफारिश कर सकते हैं।