2010-12-15 54 views
56
Class के लिए

जावा प्रलेखन कहते हैं:क्लास ऑब्जेक्ट (java.lang.Class) क्या है?

Class वस्तुओं वर्ग लोडर में defineClass विधि के लिए कॉल द्वारा जावा वर्चुअल मशीन द्वारा स्वचालित रूप से निर्माण कर रहे हैं के रूप में कक्षाएं लोड किए गए हैं और।

ये Class ऑब्जेक्ट्स क्या हैं? क्या वे new पर कॉल करके कक्षा से तत्काल वस्तुओं के समान हैं?

इसके अलावा, उदाहरण के लिए object.getClass().getName() सब कुछ Class पर सुपरक्लास को टाइपकास्ट कैसे किया जा सकता है, भले ही मुझे java.lang.Class से प्राप्त न हो?

उत्तर

71

कुछ भी टाइप नहीं किया गया Class। जावा में प्रत्येक Object एक निश्चित class से संबंधित है। यही कारण है कि Object कक्षा, जो अन्य सभी वर्गों द्वारा विरासत में मिली है, getClass() विधि को परिभाषित करती है।

getClass(), या वर्ग शाब्दिक - Foo.class एक Class वस्तु है, जो वर्ग के बारे में कुछ मेटाडेटा वापसी:

  • नाम
  • पैकेज
  • तरीकों
  • क्षेत्रों
  • कंस्ट्रक्टर्स
  • एनोटेशन

और कास्टिंग और विभिन्न चेक जैसे कुछ उपयोगी तरीके (isAbstract(), isPrimitive(), आदि)। the javadoc दिखाता है कि आप कक्षा के बारे में क्या जानकारी प्राप्त कर सकते हैं।

तो, उदाहरण के लिए, अगर तुम्हारा एक विधि एक वस्तु दिया जाता है, और आप के मामले में यह कार्रवाई करने के लिए @Processable एनोटेशन, तो साथ टिप्पणी की जाती है चाहता हूँ:

public void process(Object obj) { 
    if (obj.getClass().isAnnotationPresent(Processable.class)) { 
     // process somehow; 
    } 
} 

इस उदाहरण में, आप प्राप्त दिए गए ऑब्जेक्ट (जो कुछ भी है) के वर्ग के बारे में मेटाडेटा, और जांच करें कि क्या यह एक दी गई टिप्पणी है। एक Class उदाहरण पर तरीकों में से कई "चिंतनशील संचालन" कहा जाता है, या बस "प्रतिबिंब। प्रतिबिंब, क्यों और जब यह प्रयोग किया जाता है के बारे में Read here

भी ध्यान रखें कि enums और इंटरफेस भी एक Class वस्तु का प्रतिनिधित्व करते हैं, और राशि । संबंधित मेटाडाटा

संक्षेप में - जावा में प्रत्येक वस्तु है (के अंतर्गत आता है) एक वर्ग है, और एक संबंधित Class वस्तु है, जो इसके बारे में मेटाडेटा है, जो रनटाइम पर पहुँचा जा सकता है

+26

और इसके बारे में सोचना मजेदार है। 'कक्षा' वर्ग 'ऑब्जेक्ट' से ही विरासत में मिलता है। 'क्लास.क्लास' एक 'कक्षा' ऑब्जेक्ट देता है जो 'कक्षा' वर्ग का प्रतिनिधित्व करता है। आप प्रतिबिंब पर प्रतिबिंबित कर सकते हैं। मेरा सिर एस्प्लोइड। – cdhowie

+0

@cdhowie रूबी का अधिक उपयोग नहीं किया है, हुह? :-) –

+1

@pst: मेरे पास है। यह मुझे लोगों को चोट पहुंचाना चाहता है।[इस कई] के साथ कोई भी भाषा/ढांचा (http://ruby-doc.org/core/classes/Object.html) इसके रूट प्रकार पर विधियों को दफनाया जाना चाहिए। इसमें PHP-style tack-random-crap-on-the-API-बिना-किसी भी पूर्व-विचार सिंड्रोम है। आग लगाना ... – cdhowie

7

getClass() एक तरीका है कि। एक ऑब्जेक्ट देता है जो एक है java.lang.Class का उदाहरण ... इसमें कोई कास्टिंग शामिल नहीं है। कास्टिंग इस प्रकार दिखाई देगा:

Class<?> type = (Class<?>) object; 
34

एक क्लास वस्तु एक मेटा वस्तु एक वस्तु के वर्ग का वर्णन की तरह है।इसका उपयोग जावा की प्रतिबिंब क्षमताओं के साथ किया जाता है। आप इसे वास्तविक वर्ग के "ब्लूप्रिंट" की तरह सोच सकते हैं। जैसे आप इस तरह से एक वर्ग कार है:

public class Car { 
    public String brand; 
} 

फिर आप एक वर्ग वस्तु जो अपने "कार" वर्ग का वर्णन निर्माण कर सकते हैं।

myCarClass.getName() - returns "Car" 
myCarClass.getDeclaredField("brand") - returns a Field object describing the "brand" field 

और इतने पर:

Class myCarClass = Class.forName("Car"); 

अब आप कि कक्षा वस्तु पर अपनी कार वर्ग पर क्वेरी करने के लिए सभी प्रकार कर सकते हैं। प्रत्येक जावा ऑब्जेक्ट में एक विधि getClass() होती है जो क्लास ऑब्जेक्ट को जावा ऑब्जेक्ट की कक्षा का वर्णन करती है। तो अगर आप की तरह कुछ कर सकता है:

Car myCar = new Car(); 
Class myCarClass = myCar.getClass(); 

यह भी वस्तुओं आप नहीं जानते के लिए काम करता है, जैसे वस्तुओं आप बाहर से मिलती है:

public void tellMeWhatThisObjectsClassIs(Object obj) { 
    System.out.println(obj.getClass().getName()); 
} 

आप और इस विधि किसी भी जावा वस्तु खिलाने सकता है यह आपके द्वारा दी गई वस्तु के वास्तविक वर्ग को प्रिंट करेगा।

जावा के साथ काम करते समय, अधिकांश समय आपको कक्षा वस्तुओं के बारे में चिंता करने की आवश्यकता नहीं होती है। हालांकि उनके पास कुछ आसान उपयोग मामले हैं। जैसे वे आपको एक निश्चित वर्ग की वस्तुओं को प्रोग्रामेटिक रूप से कम करने की अनुमति देते हैं, जिसका प्रयोग ऑब्जेक्ट क्रमबद्धता और deserialization के लिए अक्सर किया जाता है (उदाहरण के लिए जावा ऑब्जेक्ट्स को एक्सएमएल और बैक में परिवर्तित करना, अधिकतर वापस)।

Class myCarClass = Class.forName("Car"); 
Car myCar = myCarClass.newInstance(); // is roughly equivalent to = new Car(); 

आप इसका उपयोग सभी घोषित क्षेत्रों या अपने वर्ग आदि, जो कुछ मामलों में बहुत उपयोगी है के तरीकों का पता लगाने के कर सकते हैं। तो उदा। अगर आपकी विधि किसी अज्ञात वस्तु को सौंपी जाती है और आपको इसके बारे में और जानना होगा, जैसे कि यह कुछ इंटरफ़ेस इत्यादि को लागू करता है, तो क्लास क्लास आपका मित्र है।

इतने लंबे समय कहानी कम, कक्षा, फील्ड, विधि, आदि वर्ग है जो java.lang.reflect पैकेज में कर रहे हैं आप अपने परिभाषित कक्षाएं, विधियां, फ़ील्ड कॉल तरीकों सभी का विश्लेषण, उनमें से नया उदाहरण बना करने की अनुमति अन्य सामानों के प्रकार और वे आपको रनटाइम पर गतिशील रूप से ऐसा करने की अनुमति देते हैं।

+0

कक्षा सी 1 = कार.क्लास; यह "वर्ग" क्या है? क्या यह एक सार्वजनिक चर है जो हर वर्ग में मौजूद है? –

+4

यह मूल रूप से वाक्य रचनात्मक चीनी है। यह कुछ ऐसा है जो संकलक कुछ ऐसा करता है जो कक्षा के ऑब्जेक्ट को दिए गए नाम से लोड करता है। क्लास.forनाम ("पूरी तरह से योग्य वर्ग नाम") के बराबर बराबर है, लेकिन वर्ग को संकलित समय पर मौजूद होने के लिए चेक किया गया है जबकि Class.forName() को रनटाइम पर निष्पादित किया जाता है। –

2

ए क्लास ऑब्जेक्ट क्लास (java.lang.Class) का एक उदाहरण है। वर्ग के जावाडोक से लिया अपने प्रश्न

कक्षा में उत्तर देना चाहिए उद्धरण नीचे कोई सार्वजनिक निर्माता है। इसके बजाए क्लास ऑब्जेक्ट्स जावा वर्चुअल मशीन द्वारा स्वचालित रूप से बनाए जाते हैं क्योंकि कक्षाएं लोड होती हैं और क्लास लोडर में defineClass विधि को कॉल करके कॉल किया जाता है।

4

मैं भी Colind के जवाब में जोड़ने के लिए है कि getClass एक ही प्रकार की घटनाओं के लिए एक ही वस्तु वापस आ जाएगी चाहते हैं। यह सच प्रिंट होगा:

MyOtherClass foo = new MyOtherClass(); 
    MyOtherClass bar = new MyOtherClass(); 
    System.out.println(foo.getClass()==bar.getClass()); 

ध्यान दें कि यह नहीं है के बराबर होती है, मैं == उपयोग कर रहा हूँ।

संबंधित मुद्दे