दिलचस्प पोस्ट
क्या मैं विजुअल स्टूडियो 2010 के सी ++ कंपाइलर का उपयोग विज़ुअल स्टूडियो 2008 के सी ++ रनटाइम लाइब्रेरी के साथ कर सकता हूं? क्यों (int) x के बजाय static_cast <int> (x) का उपयोग करें? क्लास प्रॉपर्टी बनाने के लिए कैसे? महीनों के बीच के महीनों में अंतर MySQL सी ++ में पॉइंटर्स के लिए बहुआयामी arrays को परिवर्तित करना Google मानचित्र जावास्क्रिप्ट एपीआई v3 के सर्कल के बाहर नक्शा अस्पष्टता बदलें JQuery के साथ एक ड्रॉप-डाउन सूची के चयनित मान को बदलें jqGrid: संपादन करते समय फॉर्म फ़ील्ड अक्षम करें क्या मैं यूआरएल के अंदर एक प्रतीक (@) का उपयोग कर सकता हूँ? जावा मूल पद्धति स्रोत कोड PHP जीडी अन्य छवि को मुखर करने के लिए एक छवि का उपयोग करें, पारदर्शिता सहित सरणी चर के पीछे var_dump को कनवर्ट करें सरणी चर में क्या सीवीएस से गिट तक माइग्रेशन टूल है? जावा में लूप और इटरेटर के लिए बढ़ाए गए फायदे क्या हैं? JQuery में प्रतीकों का अर्थ क्या है?

"Class.forName ()" और "class.forName ()। NewInstance ()" के बीच अंतर क्या है?

Class.forName() और Class.forName().newInstance() बीच अंतर क्या है Class.forName().newInstance() ?

मुझे महत्वपूर्ण अंतर नहीं है (मैंने उनके बारे में कुछ पढ़ा है!) कृपया आप मेरी मदद कर सकते हैं?

वेब के समाधान से एकत्रित समाधान ""Class.forName ()" और "class.forName ()। NewInstance ()" के बीच अंतर क्या है?"

हो सकता है कि दोनों तरीकों का उपयोग कैसे किया जाता है यह दिखाकर एक उदाहरण आपको चीजों को बेहतर समझने में सहायता करेगा। तो, निम्नलिखित वर्ग पर विचार करें:

 package test; public class Demo { public Demo() { System.out.println("Hi!"); } public static void main(String[] args) throws Exception { Class clazz = Class.forName("test.Demo"); Demo demo = (Demo) clazz.newInstance(); } } 

जैसा कि इसके javadoc में समझाया गया है, Class Class.forName(String) को Class ऑब्जेक्ट क्लास या इंटरफेस के साथ दिए गए स्ट्रिंग नेम से संबंधित देता है, अर्थात यह test.Demo.class देता है। test.Demo.classClass test.Demo.class वेरिएबल से प्रभावित होता है

फिर, clazz.newInstance() बुला इस Class ऑब्जेक्ट द्वारा प्रतिनिधित्व किया गया वर्ग के एक नए उदाहरण बनाता है। क्लास को तत्काल तर्क दिया जाता है जैसे कि एक खाली अभिव्यक्ति सूची के साथ एक new अभिव्यक्ति। दूसरे शब्दों में, यह वास्तव में एक new Demo() बराबर है और new Demo() एक नया उदाहरण देता है।

और इस Demo वर्ग को चलाने से निम्न आउटपुट प्रिंट होते हैं:

 Hi! 

पारंपरिक new साथ बड़ा अंतर यह है कि new newInstance एक क्लास को इन्स्तांत करने की अनुमति देता है जिसे आप रनटाइम तक नहीं जानते हैं, जिससे आपका कोड अधिक गतिशील हो जाता है।

एक ठेठ उदाहरण जेडीबीसी एपीआई है जो रनटाइम पर लोड करता है, काम करने के लिए आवश्यक सटीक ड्राइवर। ईजेबी के कंटेनर, सबलेट कंटेनर अन्य अच्छे उदाहरण हैं: वे रनटाइम से पहले कुछ भी नहीं जानते घटक लोड और लोड करने के लिए गतिशील रनटाइम लोडिंग का उपयोग करते हैं।

दरअसल, अगर आप आगे जाना चाहते हैं, तो टेड नॉर्डर्ड पेपर पर नजर डालें I understand classing for.forName () है कि मैं सिर्फ ऊपर के पैराग्राफ में स्पष्टीकरण कर रहा था।

संपादित करें (ओपी से एक प्रश्न का उत्तर देने के लिए टिप्पणी के रूप में पोस्ट किया गया है): जेडीबीसी ड्राइवरों का मामला थोड़ा खास है जैसा कि DriverManager अध्याय में बताया गया है कि जेडीबीसी एपीआई के साथ आरंभ करना :

(…) एक Driver वर्ग लोड किया जाता है, और इसलिए स्वचालित रूप से दो तरीकों से DriverManager साथ पंजीकृत है:

  1. विधि कॉल करने के लिए Class.forNameClass.forName यह स्पष्ट रूप से ड्राइवर वर्ग को लोड करता है। चूंकि यह किसी भी बाहरी सेटअप पर निर्भर नहीं है, इसलिए ड्राइवर को लोड करने का यह तरीका ड्राइवर DriverManager फ्रेमवर्क का उपयोग करने के लिए अनुशंसित है। निम्न कोड कक्षा acme.db.Driver लोड करता है:

     Class.forName("acme.db.Driver"); 

    यदि acme.db.Driver लिखा गया है, ताकि लोड हो रहा है यह एक उदाहरण बना देता है और इसके साथ ही DriverManager.registerDriver को उस उदाहरण के साथ पैरामीटर के रूप में कॉल करता है (जैसा कि यह करना चाहिए), फिर ड्राइवर ड्राइवर की सूची में है और एक कनेक्शन बनाने के लिए उपलब्ध

  2. (…)

इन दोनों मामलों में, DriverManager.registerDriver को कॉल करके स्वयं को पंजीकृत करने के लिए नव लोडेड Driver वर्ग की ज़िम्मेदारी है। जैसा कि बताया गया है, जब यह वर्ग लोड होता है, तो इसे स्वचालित रूप से किया जाना चाहिए।

आरंभीकरण के दौरान खुद को पंजीकृत करने के लिए, जेडीबीसी ड्रायवर आमतौर पर इस तरह एक स्थिर प्रारंभिक ब्लॉक का उपयोग करता है:

 package acme.db; public class Driver { static { java.sql.DriverManager.registerDriver(new Driver()); } ... } 

कॉलिंग Class.forName("acme.db.Driver") acme.db.Driver वर्ग के प्रारंभिक कारण acme.db.Driver और इस प्रकार स्थैतिक आरंभीकरण ब्लॉक का निष्पादन। और Class.forName("acme.db.Driver") वास्तव में "बना" एक उदाहरण होगा लेकिन यह सिर्फ एक परिणाम है कि कैसे (अच्छा) जेडीबीसी चालक लागू होते हैं।

एक साइड नोट के रूप में, मैं यह बताता हूं कि यह सब अब जेडीबीसी 4.0 (जावा 7 से एक डिफॉल्ट पैकेज के रूप में जोड़ा गया) और जेडीबीसी 4.0 ड्राइवरों की नई ऑटो लोडिंग सुविधा के साथ जरूरी नहीं है। जावा एसई 6 में जेडीबीसी 4.0 एन्हांसमेंट देखें

कक्षा। ForName () आपको क्लास ऑब्जेक्ट देता है, जो प्रतिबिंब के लिए उपयोगी है I तरीकों जो इस ऑब्जेक्ट को जावा द्वारा परिभाषित की जाती हैं, न कि प्रोग्रामर क्लास लिख रहे हैं। वे हर कक्षा के लिए समान हैं। नए इंस्टीसेंस () को कॉल करने से आपको उस क्लास का एक उदाहरण मिल जाता है (अर्थात क्लास के लिए। उदाहरण Class.forName("ExampleClass").newInstance() यह new ExampleClass() ) को कॉल करने के बराबर है, जिस पर आप क्लास को परिभाषित कर सकते हैं , दृश्य क्षेत्र आदि तक पहुंचें।

जेडीबीसी दुनिया में, सामान्य अभ्यास (जेडीबीसी एपीआई के मुताबिक) है कि आप जेडीबीसी चालक को लोड करने के लिए Class#forName() का उपयोग करते हैं। जेडीबीसी ड्राइवर को एक स्थिर ब्लॉक के अंदर ही DriverManager में खुद को पंजीकृत करना चाहिए:

 package com.dbvendor.jdbc; import java.sql.Driver; import java.sql.DriverManager; public class MyDriver implements Driver { static { DriverManager.registerDriver(new MyDriver()); } public MyDriver() { // } } 

Class#forName() को शामिल करना सभी स्थिर प्रारंभिक निष्पादित करेगा। इस तरह ड्राइवर getConnection() ड्राइवर को getConnection() ड्राइवरों के बीच कनेक्शन यूआरएल के दौरान कनेक्शन प्राप्त कर सकते हैं, जो कि मोटे तौर पर दिखते हैं:

 public static Connection getConnection(String url) throws SQLException { for (Driver driver : registeredDrivers) { if (driver.acceptsURL(url)) { return driver.connect(url); } } throw new SQLException("No suitable driver"); } 

लेकिन org.gjt.mm.mysql.Driver साथ शुरू होने वाली छोटी गाड़ी जेडीबीसी ड्रायवर भी थे, जो कि एक स्थिर ब्लॉक के बजाय कंसट्रक्टर के अंदर खुद को पंजीकृत करता है:

 package com.dbvendor.jdbc; import java.sql.Driver; import java.sql.DriverManager; public class BadDriver implements Driver { public BadDriver() { DriverManager.registerDriver(this); } } 

इसे गतिशील रूप से काम करने का एकमात्र तरीका है कि newInstance() को कॉल newInstance() ! अन्यथा आप पहली नजर में सामना करना पड़ेगा "SQLException: कोई उपयुक्त ड्राइवर नहीं"। एक बार फिर, यह जेडीबीसी ड्राइवर में एक बग है, न कि आपके कोड में। आजकल, कोई भी जेडीबीसी चालक इस बग में नहीं होना चाहिए। तो आप newInstance() दूर कर सकते हैं (और इसे)

1: यदि आप केवल क्लास के स्थैतिक ब्लॉक में रुचि रखते हैं, तो क्लास केवल लोड करना होगा, और स्थैतिक ब्लॉकों को निष्पादित करेगा, आपको केवल आवश्यकता है:

 Class.forName("Somthing"); 

2: यदि आप क्लास को लोड करने में रुचि रखते हैं, इसके स्थैतिक ब्लॉक निष्पादित करें और इसके अपने गैर स्थिर भाग तक पहुंचना चाहते हैं, तो आपको एक उदाहरण की आवश्यकता है और फिर आपको इसकी आवश्यकता है:

 Class.forName("Somthing").newInstance(); 

क्लास .forएन नाम () को क्लास, क्लास के लिए एक संदर्भ मिलता है। ForName ()। NewInstance () कोई नया उदाहरण वापस करने के लिए क्लास के लिए कोई- arg constructor का उपयोग करने की कोशिश करता है

"कक्षा .forName ()" दिए गए नाम के लिए क्लास-टाइप लौटाता है "नया इंस्ट्रंस ()" इस क्लास का एक उदाहरण वापस करता है

प्रकार पर आप सीधे किसी भी उदाहरण तरीकों को कॉल नहीं कर सकते हैं लेकिन केवल कक्षा के लिए प्रतिबिंब का उपयोग कर सकते हैं। यदि आप कक्षा के किसी ऑब्जेक्ट के साथ काम करना चाहते हैं, तो आपको इसके बारे में एक उदाहरण बनाना होगा ("नए मायक्लैस ()" को बुला के रूप में)

"Class.forName ()" के लिए उदाहरण

 Class myClass = Class.forName("test.MyClass"); System.out.println("Number of public methods: " + myClass.getMethods().length); 

"Class.forName () के लिए उदाहरण। NewInstance ()"

 MyClass myClass = (MyClass) Class.forName("test.MyClass").newInstance(); System.out.println("String representation of MyClass instance: " + myClass.toString()); 

सिर्फ ऊपर दिए गए उत्तरों को जोड़ते समय, जब हमारे पास एक स्थिर कोड है (अर्थात कोड ब्लॉक एक उदाहरण आज़ाद है) जिसे स्मृति में मौजूद होना चाहिए, तो हम क्लास लौटा सकते हैं, इसलिए हम कक्षा का उपयोग करेंगे। फोर्नमेड ("कुछनाम") और अगर हम नाराज कोड नहीं है जो हम कक्षा के लिए जा सकते हैं। फोर्नम ()। नया अंतर ("कुछनाम") क्योंकि यह ऑब्जेक्ट स्तर कोड ब्लॉक (गैर स्थैतिक) को स्मृति में लोड करेगा

क्लास। ForName () -> forName () क्लास क्लास का स्थिर तरीका है, वह क्लास क्लास ऑब्जेक्ट को प्रतिबिंब के लिए उपयोग नहीं करता है, जो उपयोगकर्ता वर्ग ऑब्जेक्ट नहीं है, ताकि आप केवल क्लास क्लास मेथड्स पर इसे getMethods (), getConstructors () आदि प्राप्त कर सकते हैं।

यदि आप केवल अपनी (रनटाइम दी गई) कक्षा के स्थैतिक ब्लॉक को चलाने के बारे में सोचते हैं और अपनी कक्षा के तरीकों, कन्स्ट्रक्टरों, संशोधक आदि की जानकारी प्राप्त कर रहे हैं, तो आप इस ऑब्जेक्ट के साथ ऐसा कर सकते हैं जिसे आप कक्षा .forName ()

लेकिन अगर आप अपनी क्लास विधि (कक्षा जिसे आपने रनटाइम में दिया है) में प्रवेश या कॉल करना चाहते हैं तो आपको इसके ऑब्जेक्ट की आवश्यकता है ताकि क्लास क्लास की नई पद्धति पद्धति यह आपके लिए करे। यह क्लास का नया इंस्टेंस बनायेगा और आपको इसे वापस लौटायेगा .तुम्हें टाइप करने की ज़रूरत है, इसे अपनी कक्षा में डालें।

पूर्व-: मान लें कि कर्मचारी आपकी कक्षा है

कक्षा ए = कक्षा। ForName (आर्ग्स [0]);

// args [0] = रनटाइम पर क्लास देने के लिए cmd line arguments।

कर्मचारी ob1 = a.newInstance ();

a.newInstance () नए कर्मचारी का उपयोग कर वस्तु बनाने के समान है ()

अब आप अपने सभी वर्ग दृश्यमान फ़ील्ड और विधियों तक पहुंच सकते हैं।