जावा में a.getClass()
या A.class
का उपयोग करने के लिए पसंद के आस-पास कौन से पेशेवर/विपक्ष मौजूद हैं? या तो जहाँ भी एक Class<?>
की उम्मीद है इस्तेमाल किया जा सकता है, लेकिन मुझे लगता है कि वहाँ (दोनों विभिन्न परिस्थितियों में उपयोग करते हुए वहाँ Class.forName()
और ClassLoader.loadClass()
साथ कर रहे हैं, जैसे करने के लिए प्रदर्शन या अन्य सूक्ष्म लाभ होगा।जावा में a.getClass() और A.class के बीच क्या अंतर है?
उत्तर
मैं उन्हें मामले में तुलना नहीं होता पेशेवरों की/विपक्ष क्योंकि वे विभिन्न प्रयोजनों है और दो।
a.getClass()
रिटर्न क्रम प्रकारa
। IE के के बीच शायद ही कभी वहाँ एक "विकल्प" बनाने के लिए, यदि आपके पासA a = new B();
तोa.getClass()
वापस आ जाएगीB
कक्षा।A.class
A
वर्ग स्थिर का आकलन करती है, और अक्सर प्रतिबिंब से संबंधित अन्य प्रयोजनों के लिए प्रयोग किया जाता है।
प्रदर्शन के संदर्भ में, वहाँ एक औसत दर्जे का अंतर हो सकता है, लेकिन मैं इसके बारे में कुछ भी कहना नहीं होगा, क्योंकि अंत में यह JVM और/या संकलक निर्भर है।
यह पोस्ट एक लेख here के रूप में पुनः लिखा गया है।
वे वास्तव में भिन्न हैं जहां आप उनका उपयोग कर सकते हैं। 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] तकनीकी रूप से जावा भाषा विशिष्टता किसी भी निरंतर पूल का उल्लेख नहीं करती है ... – aioobe
@aioobe: मुझे लगता है कि आप सही हैं, इसलिए मैंने सूर्य जेडीके द्वारा उत्पन्न बाइटकोड की जांच की। –
... जो तकनीकी रूप से बोलता है, वह आधिकारिक उत्तर प्रदान नहीं करता है, क्योंकि जब जावा भाषा विशिष्टता अर्थशास्त्र की बात आती है तो बाइटकोड का भी उल्लेख नहीं करता है। – aioobe
नीचे
a.getClass()!= A.class
उदाहरण पर एक नजर है, यानी एक एक का एक उदाहरण नहीं है, बल्कि एक गुमनाम उप वर्ग का एक
a.getClass()
की प्रकार का एक उदाहरण एक
वहाँ की आवश्यकता है एक अंतर है जिसे मैं जोड़ना चाहता हूं। आइए मान लें कि आपके पास कक्षा एक कन्स्ट्रक्टर है जैसा कि नीचे एक सुपर क्लास के साथ दिखाया गया है जो क्लास ऑब्जेक्ट लेता है। आप चाहते हैं कि जब भी एक सबक्लास ऑब्जेक्ट बनाया जाए तो सब क्लास 'क्लास ऑब्जेक्ट सुपर क्लास को पास किया जाना चाहिए। कोड के नीचे संकलित नहीं होगा क्योंकि आप एक कन्स्ट्रक्टर में एक इंस्टेंस विधि नहीं कॉल कर सकते हैं।उस स्थिति में यदि आप myObject.getClass()
MyClass.class
के साथ प्रतिस्थापित करते हैं। यह पूरी तरह से चला जाएगा।
Class MyClass
{
private MyClass myObject = new MyClass();
public MyClass()
{
super(myObject.getClass()); //error line compile time error
}
}
एक ही कक्षा के उदाहरण वैरिएबल के समान वर्ग के उदाहरण होने के बाद .... आप ढेर स्पेस से बाहर हो जाएंगे क्योंकि आप वस्तुओं को लगातार बना रहे हैं। –
उपयोग 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
दिलचस्प बात यह है कि ऊपर के उदाहरण में उल्लेख किया प्रदर्शन में अंतर, अन्य कारणों से संबंधित हो लगते हैं। 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
"3 अलग-अलग वर्गों का उपयोग करना"। लेकिन getClass() अनुभाग में आप 3 अलग-अलग वर्गों का उपयोग नहीं कर रहे हैं। ये सभी स्ट्रिंग हैं और इसलिए getClass सभी उदाहरणों के लिए java.lang.String लौटाएगा। – John
- 1. जावा में int.class और Integer.TYPE के बीच क्या अंतर है?
- 2. जावा में इंटरफ़ेस और @ इंटरफेस के बीच क्या अंतर है?
- 3. जावा में स्ट्रीम और पाठक के बीच क्या अंतर है?
- 4. जावा में संग्रह और सूची के बीच क्या अंतर है?
- 5. जावा में बूलियन और बूलियन के बीच क्या अंतर है?
- 6. ! = और = के बीच क्या अंतर है! जावा में?
- 7. जावा में संदर्भ और वस्तुओं के बीच क्या अंतर है?
- 8. के बीच क्या अंतर है? और जावा जेनरिक में ऑब्जेक्ट?
- 9. जावा में, this.method() और विधि() के बीच क्या अंतर है?
- 10. जावा और कोर जावा के बीच क्या अंतर है?
- 11. जावा और जावा के बीच अंतर
- 12. जावा आरएमआई और जेएमएस के बीच क्या अंतर है?
- 13. जावा और जेएसपी के बीच क्या अंतर है?
- 14. स्कैला @ सेरियलज़ेबल और जावा सीरियलज़ेबल के बीच क्या अंतर है?
- 15. # {} $ {} और% {} के बीच क्या अंतर है?
- 16. के बीच क्या अंतर है:। और: आर !?
- 17. [अपरिभाषित] और [,] के बीच क्या अंतर है?
- 18. $ और $$ के बीच क्या अंतर है?
- 19. भिन्नता और '-' के बीच क्या अंतर है?
- 20. "$^एन" और "$ +" के बीच क्या अंतर है?
- 21. Java.io.PrintWriter और java.io.BufferedWriter के बीच अंतर?
- 22. सीडीआई में संदर्भ और दायरे के बीच अंतर - और जावा
- 23. के बीच क्या अंतर है?
- 24. MATLAB में & &&& के बीच क्या अंतर है?
- 25. अंतर और कहां के बीच क्या अंतर है?
- 26. पर्ल और जावा रेगेक्स क्षमताओं के बीच अंतर क्या हैं?
- 27. PHP और जावा के बीच अंतर क्या हैं?
- 28. एलएलवीएम और जावा बाइटकोड के बीच अंतर क्या हैं?
- 29. एक्सओआर और नॉन-इक्वाल-टू के बीच क्या अंतर है?
- 30. ईजेबी, हाइबरनेट, वसंत और जेएसएफ के बीच क्या अंतर है?
कैसे के बारे में 'A.class.getClass()'? – user1870400
इससे आपको 'क्लास' ऑब्जेक्ट का प्रतिनिधित्व करने वाले वर्ग का 'क्लास' ऑब्जेक्ट मिलेगा जो कि 'java.lang.Class' का एक उदाहरण है। – aioobe