जब आप Class.forName("SomeImpl")
उपयोग करते हैं, आप वर्तमान classloader के माध्यम से वर्ग प्राप्त कर रहे हैं का उपयोग (यानी उस वर्ग का लोडर जिसे आप विधि कॉल कर रहे हैं)।यह कक्षा भी initialize कक्षा होगी। यह प्रभावी रूप से Class.forName("SomeImpl", true, currentLoader)
पर कॉल करने जैसा ही है जहां currentLoader
कॉलर का क्लासलोडर होगा। विवरण here देखें।
दूसरी विधि को पहले क्लासलोडर को चुना जाना आवश्यक है। ClassLoader.loadClass("SomeImpl")
की तरह इसे न लिखें क्योंकि यह एक स्थैतिक विधि नहीं है। आप की तरह
final ClassLoader cl = this.getClass().getClassLoader();
Class theClass = cl.loadClass("SomeImpl");
मन कुछ है कि classloader की उपवर्गों loadClass
बजाय findClass विधि ओवरराइड करना चाहिए की आवश्यकता होगी। यह (संरक्षित) विधि loadClass("SomeImpl", false)
पर कॉल करने जैसा ही है, जहां दूसरा तर्क इंगित करता है कि लिंकिंग किया जाना चाहिए या नहीं।
अधिक सूक्ष्म अंतर कर रहे हैं ... loadClass
विधि एक द्विआधारी वर्ग के नाम के रूप में, जावा भाषा विशिष्टता द्वारा निर्दिष्ट जबकि forName
भी आदिम प्रकार या सरणी वर्गों के प्रतिनिधि स्ट्रिंग्स के साथ इस्तेमाल किया जा सकता की उम्मीद है।
ओवरल, Class.forName
का उपयोग करना सबसे अच्छा है, यदि आवश्यक हो तो एक विशिष्ट क्लासलोडर निर्दिष्ट करें और क्या इसे इंटिलाइज्ड किया जाना चाहिए या नहीं, तो कार्यान्वयन बाकी को समझने दें। क्लासलोडर्स का उपयोग सीधे जार या क्लासपाथ पर संसाधन ढूंढने के लिए अच्छा होता है।
स्रोत
2011-12-01 17:18:45
व्यक्तिगत रूप से मैं अपने कोड में शाब्दिक तारों का उपयोग न करने का प्रयास करता हूं ... हार्ड-कोडित शाब्दिक के बजाय 'SomeImpl.class.getSimpleName()' लिखने पर विचार करें (कक्षा का नाम बदलने पर सिरदर्द बचाता है)। – Yuval
@ युवाल: आमतौर पर मैं आपसे सहमत हूं, लेकिन 'class.forName()' पूरे बिंदु * के मामले में यह है कि आप इसे एक स्ट्रिंग पास करते हैं। यदि आपके पास 'कक्षा' उदाहरण है जो आसपास झूठ बोल रहा है, तो आपको 'class.forName()' को कॉल करने की आवश्यकता नहीं है। और यदि आप 'SomeImpl.class' लिख सकते हैं तो आप प्रतिबिंब का उपयोग करने के बजाय' नया कुछ Impl() 'लिख सकते हैं। –
@ युवाल, गतिशील वर्ग लोडिंग जावा में एक मुख्य विशेषता है और कक्षा के बजाय स्ट्रिंग के डब्ल्यू/उपयोग करने के लिए कुछ भी नहीं है। [डी प्राइडन पहले से ही कवर करता है] – bestsss