2011-09-13 18 views
11

मुझे getClass() विधि java.lang.Object में विधि पता है। लेकिन मेरे आवेदन में, मैं अपने सभी वर्गों को जानता हूं। तो, इस विधि का उपयोग करने का वास्तविक उद्देश्य क्या है?क्या हमें java.lang.Object से getClass() विधि की आवश्यकता है?

+0

यह सवाल बहुत उपयोगी है –

उत्तर

6

आप Reflection की अद्भुत दुनिया में जा रहे हैं। प्रतिबिंब का उपयोग करके, आप कक्षाओं का प्रोग्रामेटिक रूप से निरीक्षण कर सकते हैं, अपने फ़ील्ड सेट कर सकते हैं, अपनी विधियों को कॉल कर सकते हैं आदि। आप इसके साथ कुछ वाकई शक्तिशाली चीजें कर सकते हैं, और अधिकांश ढांचे जो आप दैनिक आधार पर उपयोग करते हैं (जैसे हाइबरनेट, स्प्रिंग, गुइस इत्यादि) चीजें होने के लिए बहुत भारी निर्भर करता है।

+4

अच्छा अवलोकनलेकिन मुझे लगता है कि यह महत्वपूर्ण है कि * ढांचे * इसके साथ अद्भुत चीजें कर सकते हैं, शास्त्रीय व्यापार कोड आम तौर पर * कम से कम सीधे इसका उपयोग * से बचें, क्योंकि यह आसानी से * आपकी कोड संरचना को एक अपठनीय गड़बड़ कर सकता है। –

+2

getClass आमतौर पर समानता विधि को ओवरराइड करते समय व्यावसायिक कोड में उपयोग किया जाता है, यह जांचने के लिए कि अन्य ऑब्जेक्ट का वर्ग इस ऑब्जेक्ट की श्रेणी के समान है। –

2

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 पैकेज देखें)।

+9

"कुछ भी नहीं" सिवाय इसके कि यह किसी भी प्रतिबिंब कोड में ** ** केंद्रीय प्रकार के प्रकार को लौटाता है। –

+0

@ जोचिम सॉर ठीक है - आप सही हैं। वह शीर्ष पर थोड़ा सा था। मैंने अपनी पोस्ट को खराब कर दिया है :) – Bohemian

1

आप प्रतिबिंब के लिए Class ऑब्जेक्ट्स का उपयोग कर सकते हैं, या आप उन्हें कक्षाओं में चीजों के बारे में डेटा रखने के लिए मानचित्र में कुंजियों जैसे अन्य चीजों के लिए उपयोग कर सकते हैं।

उदाहरण के लिए, आपके पास स्थिर स्थिति & विधियों वाली कक्षा हो सकती है जो तत्काल वस्तुओं की तरह चीजें करते हैं और आंकड़े इकट्ठा करते हैं। वास्तव में, आपके पास ऐसी कई कक्षाएं हो सकती हैं जो सभी एक ही काम करते हैं और सभी एक ही तरीके से काम करते प्रतीत होते हैं, और इस प्रकार अभिसरण के लिए संभावनाएं होती हैं। चूंकि वर्ग स्थैतिक है, इसलिए आपने स्वाभाविक रूप से उस वर्ग पर कुछ राज्यों और संचालन के लिए कक्षा से मैपिंग प्राप्त की है।

इस प्रकार, आप अपने स्थैतिक वर्गों से सामान्य कोड निकाल सकते हैं और उन्हें एक कक्षा में डाल सकते हैं जो Class तर्क के साथ सभी विधियों को प्रदान करता है ताकि राज्य को निर्दिष्ट करने के लिए निम्नलिखित ऑपरेशन के दौरान उपयोग किया जाना चाहिए।

लेकिन मेरे आवेदन में, मैं अपने सभी वर्गों को जानता हूं। तो, इस विधि का उपयोग करने का वास्तविक उद्देश्य क्या है?

अब आप एक प्रणाली है कि Class वस्तुओं पर चल रही है मिल गया है, आप इसे वस्तुओं है कि आप ऐसी है कि आप अपने आवेदन में उपयोग करने का निर्णय 3 पक्ष के पुस्तकालयों के रूप में नहीं है, दे सकते हैं, और आप कर सकते हैं रनटाइम पर करो!

1

JavaDoc कहता है:

लौटे कक्षा वस्तु उद्देश्य यह है कि प्रतिनिधित्व किया वर्ग के static synchronized तरीके से बंद कर दिया जाता है।

इसका मतलब है, यदि आपका कक्षाएं एक static synchronized विधि है, JVM getClass() का उपयोग करता विधि पर एक ताला लगाना।

+0

यहां कोई सबूत नहीं है कि JVM वास्तव में इस उद्देश्य के लिए getClass() को कॉल करता है। ऐसा लगता है कि यह संभव है लेकिन यह जावाडोक द्वारा निहित नहीं है। – EJP

+1

@EJB - उद्धृत javadoc टेक्स्ट एक ** स्पष्ट अनैतिक कथन ** है कि यह जेवीएम करता है। उद्धरण में उपयोग की जाने वाली भाषा "शायद/शायद नहीं" के लिए कोई जगह नहीं छोड़ती है। –

1

कभी-कभी हमें किसी ऑब्जेक्ट के लिए 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 :) 
11

लेकिन अपने आवेदन में मैं मेरी सभी कक्षाओं को जानें। तो, इस विधि का उपयोग करने का वास्तविक उद्देश्य क्या है?

तो यदि आप इसे लिखते हैं, तो क्या आप अभी भी जानते हैं कि 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 ऑपरेटर को लागू करने के लिए वैसे भी होनी चाहिए। और यह जानकारी कचरा कलेक्टर द्वारा उपयोग की जाने वाली आमतौर पर है।

+0

अरे देखो उन्होंने ब्रह्मांड और सब कुछ जीवन के जवाब और उत्तर का उत्तर दिया! – medopal

+0

मुझे लगता है कि मेडोपोल ने आपके संदर्भ का आनंद लिया [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

+0

@medopal - मेरी माफ़ी ... मैं कभी-कभी दिन के अंत में थोड़ा "धीमा" हूं –

1

आप के लिए उपयोग कर सकते हैं:

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; 
    
संबंधित मुद्दे