ग्रूवी - मेटा ऑब्जेक्ट प्रोग्रामिंग
मेटा ऑब्जेक्ट प्रोग्रामिंग या एमओपी का उपयोग गतिशील रूप से तरीकों को लागू करने और मक्खी पर कक्षाएं और तरीके बनाने के लिए भी किया जा सकता है।
अच्छा तो इसका क्या मतलब है? आइए विद्यार्थी नामक एक वर्ग पर विचार करें, जो किसी सदस्य चर या विधियों के साथ एक खाली वर्ग की तरह है। मान लीजिए अगर आपको इस वर्ग पर निम्नलिखित कथनों को आमंत्रित करना था।
Def myStudent = new Student()
myStudent.Name = ”Joe”;
myStudent.Display()
अब मेटा ऑब्जेक्ट प्रोग्रामिंग में, भले ही कक्षा में सदस्य चर नाम या विधि प्रदर्शन () नहीं है, फिर भी उपरोक्त कोड काम करेगा।
यह कैसे काम कर सकता है? खैर, इसके लिए काम करने के लिए, किसी को ग्रूवी की निष्पादन प्रक्रिया में हुक लगाने के लिए GroovyInterceptable इंटरफ़ेस को लागू करना होगा। इस इंटरफ़ेस के लिए उपलब्ध तरीके निम्नलिखित हैं।
Public interface GroovyInterceptable {
Public object invokeMethod(String methodName, Object args)
Public object getproperty(String propertyName)
Public object setProperty(String propertyName, Object newValue)
Public MetaClass getMetaClass()
Public void setMetaClass(MetaClass metaClass)
}
तो उपरोक्त इंटरफ़ेस विवरण में, मान लें कि यदि आपको इनवोकमेथोड () लागू करना था, तो इसे हर उस विधि के लिए कहा जाएगा जो या तो मौजूद है या मौजूद नहीं है।
गुम गुण
तो आइए एक उदाहरण देखें कि हम लापता गुणों के लिए मेटा ऑब्जेक्ट प्रोग्रामिंग को कैसे लागू कर सकते हैं। निम्नलिखित कुंजी चीजों को निम्नलिखित कोड के बारे में ध्यान दिया जाना चाहिए।
कक्षा छात्र के पास नाम या आईडी परिभाषित कोई सदस्य चर नहीं है।
कक्षा के छात्र GroovyInterceptable इंटरफ़ेस को लागू करता है।
एक पैरामीटर है जिसे डायनामिकप्रॉप्स कहा जाता है जिसका उपयोग सदस्य चर के मूल्य को रखने के लिए किया जाएगा जो मक्खी पर बनाए जाते हैं।
रनटाइम के दौरान वर्ग की संपत्ति के मूल्यों को प्राप्त करने और सेट करने के लिए तरीके getproperty और setproperty लागू किए गए हैं।
class Example {
static void main(String[] args) {
Student mst = new Student();
mst.Name = "Joe";
mst.ID = 1;
println(mst.Name);
println(mst.ID);
}
}
class Student implements GroovyInterceptable {
protected dynamicProps=[:]
void setProperty(String pName,val) {
dynamicProps[pName] = val
}
def getProperty(String pName) {
dynamicProps[pName]
}
}
निम्नलिखित कोड का उत्पादन होगा -
Joe
1
गुम करने के तरीके
तो आइए एक उदाहरण देखें कि हम लापता गुणों के लिए मेटा ऑब्जेक्ट प्रोग्रामिंग को कैसे लागू कर सकते हैं। निम्नलिखित कुंजी बातें निम्नलिखित कोड के बारे में ध्यान दिया जाना चाहिए -
क्लास स्टूडेंट अब इनवोकमैथोड पद्धति को लागू करता है, जिसे इस बात की परवाह किए बिना कहा जाता है कि यह विधि मौजूद है या नहीं।
class Example {
static void main(String[] args) {
Student mst = new Student();
mst.Name = "Joe";
mst.ID = 1;
println(mst.Name);
println(mst.ID);
mst.AddMarks();
}
}
class Student implements GroovyInterceptable {
protected dynamicProps = [:]
void setProperty(String pName, val) {
dynamicProps[pName] = val
}
def getProperty(String pName) {
dynamicProps[pName]
}
def invokeMethod(String name, Object args) {
return "called invokeMethod $name $args"
}
}
निम्नलिखित कोडव्यू का आउटपुट नीचे दिखाया गया है। ध्यान दें कि विधि प्रदर्शन मौजूद नहीं है, भले ही लापता विधि अपवाद की कोई त्रुटि न हो।
Joe
1
Metaclass
यह कार्यक्षमता मेटाक्लास कार्यान्वयन से संबंधित है। डिफ़ॉल्ट कार्यान्वयन में आप अपने गेटर्स और सेटर को आमंत्रित किए बिना खेतों तक पहुंच सकते हैं। निम्न उदाहरण दिखाता है कि मेटाक्लास फ़ंक्शन का उपयोग करके हम कक्षा में निजी चर के मूल्य को बदलने में सक्षम हैं।
class Example {
static void main(String[] args) {
Student mst = new Student();
println mst.getName()
mst.metaClass.setAttribute(mst, 'name', 'Mark')
println mst.getName()
}
}
class Student {
private String name = "Joe";
public String getName() {
return this.name;
}
}
निम्नलिखित कोड का उत्पादन होगा -
Joe
Mark
विधि याद आ रही है
ग्रूवी मेथसिमिंग की अवधारणा का समर्थन करता है। यह विधि invokeMethod से भिन्न है कि यह केवल एक विफल विधि प्रेषण के मामले में लागू किया जाता है, जब दिए गए नाम और / या दिए गए तर्कों के लिए कोई विधि नहीं मिल सकती है। निम्न उदाहरण दिखाता है कि मेथडिसिंग का उपयोग कैसे किया जा सकता है।
class Example {
static void main(String[] args) {
Student mst = new Student();
mst.Name = "Joe";
mst.ID = 1;
println(mst.Name);
println(mst.ID);
mst.AddMarks();
}
}
class Student implements GroovyInterceptable {
protected dynamicProps = [:]
void setProperty(String pName, val) {
dynamicProps[pName] = val
}
def getProperty(String pName) {
dynamicProps[pName]
}
def methodMissing(String name, def args) {
println "Missing method"
}
}
निम्नलिखित कोड का उत्पादन होगा -
Joe
1
Missing method