2011-10-13 12 views
22

से एक वर्ग का दृष्टांत को this question about the Groovy way to dynamically invoke a static method का जवाब बहुत मददगार थे, लेकिन मैं निम्नलिखित मामले में परेशानी आ रही:ग्रूवी डायनामिक स्ट्रिंग

class Item { 
    def id = 1 
    def data = [ "a", "b" ] 
} 

मैं तो:

मैं एक साधारण ग्रूवी वर्ग परिभाषित

class Util { 
    static def main(args) { 
    def cls = "Item" as Class 
    def instance = cls.newInstance() 
    println instance.toString() 
    } 
} 

Util.groovy एक ही फ़ोल्डर में है के रूप में Item.groovy

: एक सरल उपयोगिता वर्ग गतिशील मद वर्ग लोड करने के लिए चाहता है कि परिभाषित

जब मैं Util.groovy मैं निम्नलिखित त्रुटि मिलती है चलाने का प्रयास:

Caught: org.codehaus.groovy.runtime.typehandling.GroovyCastException: 
Cannot cast object 'Item' with class 'java.lang.String' 
to class 'java.lang.Class' due to: 
java.lang.ClassNotFoundException: Item 
     at Util.main(Util.groovy:3) 

एक ही तरीका है कि मैं यह काम कर सकता है groovyc का उपयोग कर Item.groovy precompile करने के द्वारा किया गया था, लेकिन इस किया जा रहा है की बात याद करते हैं ग्रूवी :)

उत्तर

28

यह काम करता है underlying GroovyClassLoader का उपयोग कर:

def instance = this.class.classLoader.loadClass('Item', true, false)?.newInstance() 
+1

आपको शायद 'this.class' को' this.getClass() 'में बदलना चाहिए। [आम तौर पर संपत्ति या मानचित्र लुकअप (या invokeMethod ओवरराइड) से बचने के लिए पूर्ण विधि का उपयोग करने की अनुशंसा की जाती है (http://groovy.329449.n5.nabble.com/class-vs-getClass-td368617.html)। – OverZealous

+8

जब हम जानते हैं कि यह मानचित्र क्यों नहीं है परेशान क्यों? गतिशील गले लगाओ! ;-) –

+0

यह काम किया! धन्यवाद टिम! :) –

5

मैं सिर्फ यह करना ही था और एक दिलचस्प रास्ता मिल गया - तो मैंने सोचा कि मैं वापस आ जाओ और यह उल्लेख होगा।

मैं इस के साथ एक समस्या थी क्योंकि मैं (एक गैर-डिफ़ॉल्ट निर्माता का उपयोग करें) newInstance के लिए एक मूल्य पारित करने के लिए करना चाहता था और सभी समाधान काम का एक छोटा सा लग रहा था (मैं, आलसी हूँ ठीक?)

वैसे भी, आप एक नया पूर्णांक (5) बनाना चाहते हैं लगता है ... इस प्रयास करें:

c = "java.lang.Integer" 
p = "5" 
def result = Eval.me("return new ${c}(${p})") 
assert(result == 5) 

वास्तव में अच्छी तरह काम किया, हालांकि मुझे यकीन है कि यह सबसे धीमी समाधान संभव के बारे में हूँ। इसका लाभ यह है कि विधि कई अन्य परिस्थितियों पर लागू होती है।

+3

आईटी सेम्स जावास्क्रिप्ट प्लेगिया :) –

+0

@ बिल बौद्धिक स्तर पर दिलचस्प है, लेकिन यह वास्तव में ग्रोवी तरीके से नहीं है, जैसे अब्दनेर टोमू ने कहा –

+0

मैं सहमत हूं, पूर्णता और आसानी के लिए इसका उल्लेख किया है - कभी-कभी आप केवल एक- ऑफ स्क्रिप्ट और यह याद रखना और लचीला आसान है। –

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