इस प्रयास करें:
def cl = Class.forName("org.package.Foo")
cl.get(1)
थोड़ा सा रह गया लेकिन काम करना चाहिए।
आप स्थिर तरीकों के लिए कोड की तरह "स्विच" बनाने के लिए चाहते हैं, तो मैं वर्गों का दृष्टांत (भले ही वे केवल स्थिर तरीकों) और नक्शे पर उदाहरणों को बचाने के लिए सुझाव देते हैं। तुम तो
map[name].get(1)
का उपयोग उन में से एक को चुनने के लिए कर सकते हैं।
[संपादित करें]"$name"
एक GString
है और इस तरह एक वैध बयान के रूप में। "$name".foo()
विधि वर्ग GString
की foo()
फोन का अर्थ है "
[EDIT2] एक वेब कंटेनर (Grails की तरह), आप classloader में बताने की वहाँ दो विकल्प हैं का उपयोग करते समय:।।
Class.forName("com.acme.MyClass", true, Thread.currentThread().contextClassLoader)
या
Class.forName("com.acme.MyClass", true, getClass().classLoader)
पहला विकल्प एक वेब संदर्भ में केवल काम करेंगे, दूसरा दृष्टिकोण भी इकाई परीक्षण के लिए काम करता है। यह इस तथ्य पर निर्भर करता है कि आप आमतौर पर कर सकते हैं उसी श्रेणी के रूप में उसी क्लासलोडर का उपयोग करें जो forName()
को आमंत्रित करता है।
आप समस्या है, तो फिर अपने इकाई परीक्षण में पहला विकल्प का उपयोग करें और सेट contextClassLoader
:
def orig = Thread.currentThread().contextClassLoader
try {
Thread.currentThread().contextClassLoader = getClass().classLoader
... test ...
} finally {
Thread.currentThread().contextClassLoader = orig
}
स्रोत
2009-02-23 13:28:47
कक्षाएं "आवंटित" नहीं होतीं - केवल विधियां। यह वास्तव में क्या है कि आप आह्वान करना चाहते हैं? क्या आप MyOwnClass.static_property() जैसी कुछ करना चाहते हैं? या myInstanceOfClass.methodName()? – Chii
मेरा अनुमान है कि वह कक्षा पर एक स्थिर विधि का आह्वान करना चाहता है। –
मैं कक्षा पर एक स्थैतिक विधि का आह्वान करना चाहता हूं, एक वर्ग I जिसे मैं रन टाइम तक नहीं जानता। मुझे पता है कि क्लास .forName का उपयोग करने के लिए जावा तरीका है, अगर यह ऐसा करने के लिए ग्रोवी तरीका था तो विधियों के लिए ऐसा ही उत्सुक था। –