2012-06-08 23 views
87

जावा में a.getClass() या A.class का उपयोग करने के लिए पसंद के आस-पास कौन से पेशेवर/विपक्ष मौजूद हैं? या तो जहाँ भी एक Class<?> की उम्मीद है इस्तेमाल किया जा सकता है, लेकिन मुझे लगता है कि वहाँ (दोनों विभिन्न परिस्थितियों में उपयोग करते हुए वहाँ Class.forName() और ClassLoader.loadClass() साथ कर रहे हैं, जैसे करने के लिए प्रदर्शन या अन्य सूक्ष्म लाभ होगा।जावा में a.getClass() और A.class के बीच क्या अंतर है?

उत्तर

138

मैं उन्हें मामले में तुलना नहीं होता पेशेवरों की/विपक्ष क्योंकि वे विभिन्न प्रयोजनों है और दो।

  • a.getClass() रिटर्न क्रम प्रकार a। IE के के बीच शायद ही कभी वहाँ एक "विकल्प" बनाने के लिए, यदि आपके पास A a = new B(); तो a.getClass() वापस आ जाएगी B कक्षा।

  • A.classA वर्ग स्थिर का आकलन करती है, और अक्सर प्रतिबिंब से संबंधित अन्य प्रयोजनों के लिए प्रयोग किया जाता है।

प्रदर्शन के संदर्भ में, वहाँ एक औसत दर्जे का अंतर हो सकता है, लेकिन मैं इसके बारे में कुछ भी कहना नहीं होगा, क्योंकि अंत में यह JVM और/या संकलक निर्भर है।


यह पोस्ट एक लेख here के रूप में पुनः लिखा गया है।

+0

कैसे के बारे में 'A.class.getClass()'? – user1870400

+0

इससे आपको 'क्लास' ऑब्जेक्ट का प्रतिनिधित्व करने वाले वर्ग का 'क्लास' ऑब्जेक्ट मिलेगा जो कि 'java.lang.Class' का एक उदाहरण है। – aioobe

30

वे वास्तव में भिन्न हैं जहां आप उनका उपयोग कर सकते हैं। A.class संकलन समय पर काम करता है जबकि a.getClass() को A टाइप करने की आवश्यकता होती है और रनटाइम पर काम करता है।

एक प्रदर्शन अंतर भी हो सकता है। जबकि A.class संकलक द्वारा हल किया जा सकता है क्योंकि यह वास्तविक प्रकार A, a.getClass() रनटाइम पर एक वर्चुअल विधि कॉल हो रहा है।

संदर्भ के लिए, एक संकलक को लक्षित बाईटकोड आम तौर पर Integer.getClass() के लिए निम्नलिखित निर्देशों का उत्सर्जन करता है:

aload_1 
invokevirtual #3; //Method java/lang/Object.getClass:()Ljava/lang/Class; 

और Integer.class के लिए निम्नलिखित:

//const #3 = class #16; // java/lang/Integer 

ldc_w #3; //class java/lang/Integer 

पूर्व आम तौर पर एक आभासी विधि प्रेषण शामिल है और इसलिए होगा संभवतः निष्पादित करने में लंबा समय लगता है। हालांकि अंत में जेवीएम-निर्भर है।

+1

[1] तकनीकी रूप से जावा भाषा विशिष्टता किसी भी निरंतर पूल का उल्लेख नहीं करती है ... – aioobe

+0

@aioobe: मुझे लगता है कि आप सही हैं, इसलिए मैंने सूर्य जेडीके द्वारा उत्पन्न बाइटकोड की जांच की। –

+1

... जो तकनीकी रूप से बोलता है, वह आधिकारिक उत्तर प्रदान नहीं करता है, क्योंकि जब जावा भाषा विशिष्टता अर्थशास्त्र की बात आती है तो बाइटकोड का भी उल्लेख नहीं करता है। – aioobe

5

नीचे

a.getClass()!= A.class उदाहरण पर एक नजर है, यानी एक एक का एक उदाहरण नहीं है, बल्कि एक गुमनाम उप वर्ग का एक

a.getClass() की प्रकार का एक उदाहरण एक

1

वहाँ की आवश्यकता है एक अंतर है जिसे मैं जोड़ना चाहता हूं। आइए मान लें कि आपके पास कक्षा एक कन्स्ट्रक्टर है जैसा कि नीचे एक सुपर क्लास के साथ दिखाया गया है जो क्लास ऑब्जेक्ट लेता है। आप चाहते हैं कि जब भी एक सबक्लास ऑब्जेक्ट बनाया जाए तो सब क्लास 'क्लास ऑब्जेक्ट सुपर क्लास को पास किया जाना चाहिए। कोड के नीचे संकलित नहीं होगा क्योंकि आप एक कन्स्ट्रक्टर में एक इंस्टेंस विधि नहीं कॉल कर सकते हैं।उस स्थिति में यदि आप myObject.getClass()MyClass.class के साथ प्रतिस्थापित करते हैं। यह पूरी तरह से चला जाएगा।

Class MyClass 
{ 
    private MyClass myObject = new MyClass(); 
    public MyClass() 
    { 
     super(myObject.getClass()); //error line compile time error 
    } 
} 
+2

एक ही कक्षा के उदाहरण वैरिएबल के समान वर्ग के उदाहरण होने के बाद .... आप ढेर स्पेस से बाहर हो जाएंगे क्योंकि आप वस्तुओं को लगातार बना रहे हैं। –

4

उपयोग a.getClass आप वर्ग/प्रकार का एक उदाहरण है और आप इसे का सही प्रकार प्राप्त करने के लिए चाहते हैं। जबकि a.class का उपयोग तब किया जाता है जब आपके पास type उपलब्ध है और आप इसका उदाहरण बनाना चाहते हैं।
भी getClass() रनटाइम प्रकार का उदाहरण देता है जबकि .class संकलन समय पर मूल्यांकन किया जाता है।
getClass() और .class, .class के प्रदर्शन को ध्यान में रखते हुए getClass() से बेहतर प्रदर्शन है।
उदाहरण:

public class PerfomanceClass { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     long time=System.nanoTime(); 
     Class class1="String".getClass(); 
     class1="String".getClass(); 
     class1="String".getClass(); 
     class1="String".getClass(); 

     System.out.println("time (getClass()) :"+(System.nanoTime()-time)+" ns");  


     long time2=System.nanoTime(); 
     Class class2=String.class; 
     class2=String.class; 
     class2=String.class; 
     class2=String.class; 

     System.out.println("time (.class):"+(System.nanoTime()-time2)+" ns"); 
    } 

} 

आउटपुट:

time (getClass()) : 79410 ns 
time (.class)  : 8032 ns 
1

दिलचस्प बात यह है कि ऊपर के उदाहरण में उल्लेख किया प्रदर्शन में अंतर, अन्य कारणों से संबंधित हो लगते हैं। 3 अलग अलग वर्गों का उपयोग करना, औसत में प्रदर्शन लगभग वैसी ही होगी:

import java.util.LinkedHashMap; 
public class PerfomanceClass { 

public static void main(String[] args) { 

    long time = System.nanoTime(); 
    Class class1 = "String".getClass(); 
    Class class11 = "Integer".getClass(); 
    Class class111 = "LinkedHashMap".getClass(); 

    System.out.println("time (getClass()) :" + (System.nanoTime() - time) + " ns"); 

    long time2 = System.nanoTime(); 
    Class class2 = String.class; 
    Class class22 = Integer.class; 
    Class class222 = LinkedHashMap.class; 

    System.out.println("time (.class):" + (System.nanoTime() - time2) + " ns"); 
} } 
कुछ

आउटपुट हो जाएगा की तरह:

time (getClass()) :23506 ns 
time (.class):23838 ns 

और कॉल के आदेश स्विचन भी getClass() में परिणाम होगा जा रहा है तेजी से ।

import java.util.LinkedHashMap; 

public class PerfomanceClass { 

public static void main(String[] args) { 
    long time2 = System.nanoTime(); 
    Class class2 = LinkedHashMap.class; 

    System.out.println("time (.class):" + (System.nanoTime() - time2) + " ns"); 

    long time = System.nanoTime(); 
    Class class1 = "LinkedHashMap".getClass(); 

    System.out.println("time (getClass()) :" + (System.nanoTime() - time) + " ns"); 
}} 

आउटपुट:

time (.class):33108 ns 
time (getClass()) :6622 ns 
+0

"3 अलग-अलग वर्गों का उपयोग करना"। लेकिन getClass() अनुभाग में आप 3 अलग-अलग वर्गों का उपयोग नहीं कर रहे हैं। ये सभी स्ट्रिंग हैं और इसलिए getClass सभी उदाहरणों के लिए java.lang.String लौटाएगा। – John

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