मुझे getClass()
विधि java.lang.Object
में विधि पता है। लेकिन मेरे आवेदन में, मैं अपने सभी वर्गों को जानता हूं। तो, इस विधि का उपयोग करने का वास्तविक उद्देश्य क्या है?क्या हमें java.lang.Object से getClass() विधि की आवश्यकता है?
उत्तर
आप Reflection की अद्भुत दुनिया में जा रहे हैं। प्रतिबिंब का उपयोग करके, आप कक्षाओं का प्रोग्रामेटिक रूप से निरीक्षण कर सकते हैं, अपने फ़ील्ड सेट कर सकते हैं, अपनी विधियों को कॉल कर सकते हैं आदि। आप इसके साथ कुछ वाकई शक्तिशाली चीजें कर सकते हैं, और अधिकांश ढांचे जो आप दैनिक आधार पर उपयोग करते हैं (जैसे हाइबरनेट, स्प्रिंग, गुइस इत्यादि) चीजें होने के लिए बहुत भारी निर्भर करता है।
अच्छा अवलोकनलेकिन मुझे लगता है कि यह महत्वपूर्ण है कि * ढांचे * इसके साथ अद्भुत चीजें कर सकते हैं, शास्त्रीय व्यापार कोड आम तौर पर * कम से कम सीधे इसका उपयोग * से बचें, क्योंकि यह आसानी से * आपकी कोड संरचना को एक अपठनीय गड़बड़ कर सकता है। –
getClass आमतौर पर समानता विधि को ओवरराइड करते समय व्यावसायिक कोड में उपयोग किया जाता है, यह जांचने के लिए कि अन्य ऑब्जेक्ट का वर्ग इस ऑब्जेक्ट की श्रेणी के समान है। –
getClass()
ऑब्जेक्ट पर एक सार्वजनिक विधि है, इसलिए यह सभी कक्षाओं के सभी उदाहरणों के लिए विरासत में मिला है। यदि आप किसी प्रकार के सुपर प्रकार (सुपर क्लास या इंटरफ़ेस इत्यादि) से निपट रहे हैं और आप कार्यान्वयन कक्षा को जानना चाहते हैं, तो getClass()
आपको किसी ऑब्जेक्ट की श्रेणी बताएगा। फिर आप अधिक जानकारी प्राप्त करने के लिए कक्षा का निरीक्षण कर सकते हैं।
एक साधारण उदाहरण:
public static void doSomething(Object obj) {
if (obj.getClass().isArray()) {
System.out.println("It's an array");
} else {
System.out.println("It's not an array");
}
}
btw, getClass()
ही प्रतिबिंब का हिस्सा नहीं है - यह एक सरल तरीका है कि एक सीधा (वर्ग) ऑब्जेक्ट है। हालांकि, कक्षा के बारे में बहुत सारी रोचक चीजों को जानने के लिए getClass()
से लौटाई गई क्लास ऑब्जेक्ट प्रतिबिंब के साथ उपयोग की जा सकती है (java.lang.reflect
पैकेज देखें)।
"कुछ भी नहीं" सिवाय इसके कि यह किसी भी प्रतिबिंब कोड में ** ** केंद्रीय प्रकार के प्रकार को लौटाता है। –
@ जोचिम सॉर ठीक है - आप सही हैं। वह शीर्ष पर थोड़ा सा था। मैंने अपनी पोस्ट को खराब कर दिया है :) – Bohemian
आप प्रतिबिंब के लिए Class
ऑब्जेक्ट्स का उपयोग कर सकते हैं, या आप उन्हें कक्षाओं में चीजों के बारे में डेटा रखने के लिए मानचित्र में कुंजियों जैसे अन्य चीजों के लिए उपयोग कर सकते हैं।
उदाहरण के लिए, आपके पास स्थिर स्थिति & विधियों वाली कक्षा हो सकती है जो तत्काल वस्तुओं की तरह चीजें करते हैं और आंकड़े इकट्ठा करते हैं। वास्तव में, आपके पास ऐसी कई कक्षाएं हो सकती हैं जो सभी एक ही काम करते हैं और सभी एक ही तरीके से काम करते प्रतीत होते हैं, और इस प्रकार अभिसरण के लिए संभावनाएं होती हैं। चूंकि वर्ग स्थैतिक है, इसलिए आपने स्वाभाविक रूप से उस वर्ग पर कुछ राज्यों और संचालन के लिए कक्षा से मैपिंग प्राप्त की है।
इस प्रकार, आप अपने स्थैतिक वर्गों से सामान्य कोड निकाल सकते हैं और उन्हें एक कक्षा में डाल सकते हैं जो Class
तर्क के साथ सभी विधियों को प्रदान करता है ताकि राज्य को निर्दिष्ट करने के लिए निम्नलिखित ऑपरेशन के दौरान उपयोग किया जाना चाहिए।
लेकिन मेरे आवेदन में, मैं अपने सभी वर्गों को जानता हूं। तो, इस विधि का उपयोग करने का वास्तविक उद्देश्य क्या है?
अब आप एक प्रणाली है कि Class
वस्तुओं पर चल रही है मिल गया है, आप इसे वस्तुओं है कि आप ऐसी है कि आप अपने आवेदन में उपयोग करने का निर्णय 3 पक्ष के पुस्तकालयों के रूप में नहीं है, दे सकते हैं, और आप कर सकते हैं रनटाइम पर करो!
JavaDoc कहता है:
लौटे कक्षा वस्तु उद्देश्य यह है कि प्रतिनिधित्व किया वर्ग के
static synchronized
तरीके से बंद कर दिया जाता है।
इसका मतलब है, यदि आपका कक्षाएं एक static synchronized
विधि है, JVM getClass()
का उपयोग करता विधि पर एक ताला लगाना।
यहां कोई सबूत नहीं है कि JVM वास्तव में इस उद्देश्य के लिए getClass() को कॉल करता है। ऐसा लगता है कि यह संभव है लेकिन यह जावाडोक द्वारा निहित नहीं है। – EJP
@EJB - उद्धृत javadoc टेक्स्ट एक ** स्पष्ट अनैतिक कथन ** है कि यह जेवीएम करता है। उद्धरण में उपयोग की जाने वाली भाषा "शायद/शायद नहीं" के लिए कोई जगह नहीं छोड़ती है। –
कभी-कभी हमें किसी ऑब्जेक्ट के लिए Class
उदाहरण की आवश्यकता होती है।हम इंटरफेस के खिलाफ कार्यक्रम है, लेकिन अब एक कार्यान्वयन के वास्तविक प्रकार की जरूरत की तरह:
List<?> someListImplementation = geListMagically();
System.out.println(someListImplementation.getClass().getName());
यहाँ तुच्छ उदाहरण कारण है कि हम getClass()
java.lang.Object
पर की जरूरत है:,
Object obj = "A String";
System.out.println(obj.getClass().getName()); // calls Object#getClass()
// and prints java.lang.String :)
लेकिन अपने आवेदन में मैं मेरी सभी कक्षाओं को जानें। तो, इस विधि का उपयोग करने का वास्तविक उद्देश्य क्या है?
तो यदि आप इसे लिखते हैं, तो क्या आप अभी भी जानते हैं कि things[0]
की असली कक्षा क्या है?
Object[] things = new Object[]{
"Hi mum", new Integer(42), /* and a whole bunch more */};
shuffle(things);
सैद्धांतिक रूप से, आप बाहर things[0]
के वर्ग instanceof
भाव पर एक लंबी श्रृंखला का उपयोग कर काम कर सकता था, लेकिन उस दर्दनाक होता है। यह समस्या हल करता है।
Class cls = things[0].getClass();
अब, मैं आप प्रदान कर देंगे कि आप अक्सर बात की इस तरह करने की ज़रूरत नहीं है। लेकिन जब आप करते हैं, Object.getClass()
की कार्यक्षमता बहुत अधिक अनिवार्य है।
और जैसा कि अन्य उत्तरों बताते हैं, getClass()
विधि उन अनुप्रयोगों के लिए बहुत महत्वपूर्ण है जो स्थैतिक टाइपिंग की सीमाओं को प्राप्त करने के लिए प्रतिबिंब का उपयोग करते हैं।
मुझे लगता है कि, अन्य प्रश्न Object.getClass()
विधि के अस्तित्व JVM प्रदर्शन पर कोई प्रभाव पड़ता है कि क्या है। जवाब नहीं है। विधि केवल उस जानकारी को उजागर कर रही है जो instanceof
ऑपरेटर को लागू करने के लिए वैसे भी होनी चाहिए। और यह जानकारी कचरा कलेक्टर द्वारा उपयोग की जाने वाली आमतौर पर है।
अरे देखो उन्होंने ब्रह्मांड और सब कुछ जीवन के जवाब और उत्तर का उत्तर दिया! – medopal
मुझे लगता है कि मेडोपोल ने आपके संदर्भ का आनंद लिया [42] (http://en.wikipedia.org/wiki/Phrases_from_The_Hitchhiker%27s_Guide_to_the_Galaxy#Answer_to_the_Ultimate_Question_of_Life.2C_the_Universe.2C_and_Everything_.2842.29); मुझे नहीं लगता कि यह नकारात्मक तरीके से था। ओह, और +1, बीटीडब्ल्यू (42 के लिए नहीं बल्कि एक अच्छे जवाब के लिए)। – Heinzi
@medopal - मेरी माफ़ी ... मैं कभी-कभी दिन के अंत में थोड़ा "धीमा" हूं –
आप के लिए उपयोग कर सकते हैं:
Constructor[] constructors = this.getClass().getConstructors()
- वर्ग के क्षेत्र मिल (प्रतिबिंब):
- वर्ग के निर्माताओं मिल
Field[] fields = this.getClass().getFields();
- instanceof के बजाय इसका उपयोग विधि के बराबर होती है में बराबर विधि के symetry अनुबंध perserve करने के लिए (के रूप में समझाया here)
if (obj == null) return false; if (getClass() != obj.getClass()) return false;
- 1. हमें क्यों जारी रखने की विधि की आवश्यकता है?
- 2. हमें सी # प्रतिनिधियों की आवश्यकता क्यों है
- 3. हमें फ़ील्ड टैग की आवश्यकता क्यों है?
- 4. हमें लक्ष्य नामस्थान की आवश्यकता क्यों है?
- 5. हमें "हटाएं []" ऑपरेटर की आवश्यकता क्यों है?
- 6. हमें वेब-सॉकेट की आवश्यकता क्यों है?
- 7. हमें "आउट" पैरामीटर की आवश्यकता क्यों है?
- 8. हमें strdup() की आवश्यकता क्यों है?
- 9. हमें डिज़ाइन पैटर्न की आवश्यकता क्यों है
- 10. हमें संरचना की आवश्यकता क्यों है? (सी #)
- 11. हमें यहां टाइपनाम की आवश्यकता क्यों है?
- 12. क्लोन() विधि java.lang.Object में संरक्षित क्यों है?
- 13. जब हमें एक से अधिक EntityManager की आवश्यकता होती है?
- 14. राइनो मोक्स - क्या हमें वास्तव में स्टब्स की आवश्यकता है?
- 15. फोनगैप स्टार्टअप - क्या हमें उन सभी फ़ाइलों की आवश्यकता है?
- 16. क्या हमें अभी भी रिचटर के AsyncEnumerator की आवश्यकता है?
- 17. क्या हमें कार्य घोषणा के बाद अर्धविराम की आवश्यकता है?
- 18. क्या हमें इस परिदृश्य में हाइबरनेट मैपिंग की आवश्यकता है?
- 19. क्या हमें अभी भी इटरेटर डिजाइन पैटर्न की आवश्यकता है?
- 20. क्या हमें टीसीएल में चर "अनसेट" करने की आवश्यकता है?
- 21. क्या हमें अंत में अर्धविराम की आवश्यकता है?
- 22. java.lang.Object
- 23. हमें पाइथन आयात विवरणों की आवश्यकता कब होती है?
- 24. हमें मूल क्वेरी बनाने की आवश्यकता क्यों है?
- 25. अमूर्त वर्ग में getClass() संदिग्ध विधि कॉल
- 26. मार्शलिंग - यह क्या है और हमें इसकी आवश्यकता क्यों है?
- 27. हमें सी ++ में शुद्ध आभासी विनाशक की आवश्यकता क्यों है?
- 28. हमें एक अस्थायी डेटाबेस की आवश्यकता क्यों है?
- 29. हमें जावा में इंटरफेस की आवश्यकता क्यों है?
- 30. हमें तीसरे पक्ष के निर्माण उपकरण की आवश्यकता क्यों है?
यह सवाल बहुत उपयोगी है –