2009-09-22 17 views
8

पर स्थिर तरीकों को जोड़ना मुझे एक ग्रोवी मेटा-प्रोग्रामिंग समस्या का सामना करना पड़ा है जिसे मैं हल करने में असमर्थ हूं।ग्रोवी मेटा प्रोग्रामिंग - ऑब्जेक्ट.मैटा क्लास

जब वर्ग FooBar को स्थिर विधि foo() जोड़ने, तो FooBar.foo() के रूप में उम्मीद काम करता है:

FooBar.metaClass.static.foo = { 
    println "hello" 
} 
FooBar.foo() 

हालांकि, मैं बजाय वर्ग वस्तु के लिए एक ही स्थिर विधि foo() जोड़ने , तो FooBar.foo() एक MissingMethodException के साथ विफल:

Object.metaClass.static.foo = { 
    println "hello" 
} 
FooBar.foo() 
// groovy.lang.MissingMethodException: 
// No signature of method: FooBar.foo() is applicable for argument types: 
//() values: [] 

कि क्यों है? Object.metaClass.static.foo = { .. } FooBar को foo() भी नहीं जोड़ना चाहिए?

उत्तर

11

क्रम व्यवहार आप देख रहे हैं आप ExpandoMetaClass.enableGlobally कॉल करने की आवश्यकता के लिए प्राप्त करने के लिए()

ध्यान रखें कर यह सामान्य मेटा-प्रोग्रामिंग से बड़ी स्मृति पदचिह्न है।

http://groovy.codehaus.org/api/groovy/lang/ExpandoMetaClass.html#enableGlobally()

+0

हाय! दस्तावेज़ों से निर्णय लेना यह सही उत्तर होना चाहिए, लेकिन अपवाद अभी भी फेंक दिया गया है जब ExpandoMetaClass.enableGlobally() ग्रोवी स्क्रिप्ट की शुरुआत में चलाया जाता है। क्या आप ऑब्जेक्ट के लिए एक स्थिर विधि इंजेक्ट करने में सक्षम हैं और क्या यह वस्तुओं को विस्तारित करने के लिए उपलब्ध है? – knorv

1

मैं इस के बाद भी मैं स्क्रिप्ट की शुरुआत में ExpandoMetaClass.enableGlobally() जोड़ा काम करने के लिए प्राप्त करने के लिए प्रतीत नहीं कर सकते हैं:

ExpandoMetaClass.enableGlobally(); 
Object.metaClass.static.Log = { msg -> 
    println(msg); 
} 

class Foo { 
    def l() { 
     Log("Foo:l().log"); // works 
    } 
} 

Object.Log("Object.log"); // works 
String.Log("String.log"); // works 

Log("script.log");  // works 


foo = new Foo(); 

foo.l(); 
foo.Log("foo.log"); // works 
Foo.Log("Foo.log") // Does not work 
संबंधित मुद्दे