2014-10-29 6 views
7

मैं एक कोड इस तरह है:जावा में getClass() को कैसे लागू किया जाता है?

public class QueueSample { 

    public static void main(String[] args) { 
     System.out.println(new QueueSample().getClass()); 
    } 

} 

यह प्रिंट:

class QueueSample 

getClass() विधि Object वर्ग से आ रही है।

public final native Class<?> getClass(); 

अपने यहां लागू नहीं किया है, तो कहाँ और कैसे इस पद्धति लागू हो गया है: Object के स्रोत कोड को देखते हुए, मैं इस तरह केवल विधि परिभाषा देख सकते हैं?

+2

'getClass()' मूल विधि कॉल है .. तो, आपके पास जेडीके के साथ भेजे गए स्रोत कोड में उस विधि का स्रोत कोड नहीं होगा। – TheLostMind

+0

@TheLostMind: तो, फिर देशी कोड इसे कैसे कार्यान्वित करता है? – batman

+0

@batman आप क्यों जानना चाहते हैं? यह कुछ जटिल है जो पूरी तरह से जावा वर्चुअल मशीन लागू करने के तरीके पर निर्भर करता है और यह आंतरिक डेटा संरचना कैसे कार्य करता है। यह जेवीएम के प्रति विक्रेता और संस्करण को अलग कर सकता है। जब तक getClass() विनिर्देश की तरह काम करता है, इसका वर्णन करता है, आपको यह जानने की आवश्यकता नहीं है कि यह कैसे कार्यान्वित किया गया है। –

उत्तर

5

@TheLostMind का उल्लेख किया है, आप OpenJDK से स्रोत कोड प्राप्त कर सकते हैं - कुछ हद तक एक newer version (JDK9) में देख, getClass() देशी विधि

JNIEXPORT jclass JNICALL 
Java_java_lang_Object_getClass(JNIEnv *env, jobject this) 
{ 
    if (this == NULL) { 
     JNU_ThrowNullPointerException(env, NULL); 
     return 0; 
    } else { 
     return (*env)->GetObjectClass(env, this); 
    } 
} 

तो तरह कार्यान्वित किया जाता है, अनिवार्य रूप से उसके द्वारा यह JVM के प्रतिनिधियों है पर्यावरण Class ऑब्जेक्ट को वापस करने के लिए GetObjectClass() फ़ंक्शन का उपयोग करता है। आप इसे शुरुआती बिंदु के रूप में उपयोग कर सकते हैं - यदि आप गहराई से जाना चाहते हैं, तो मेरा सुझाव है कि आप Mercurial का उपयोग करके http://hg.openjdk.java.net/ से जेडीके स्रोत कोड देखें, ताकि आप इसे ब्राउज़ कर सकें। जब इस तरह के हॉटस्पॉट के रूप में एक JIT कम्पाइलर का उपयोग कर

@Holger उल्लेख के रूप में, वहाँ कुछ प्रदर्शन अनुकूलन कर रहे हैं - उदाहरण के लिए, Performance techniques used in the Hotspot JVM कहते हैं, "Object.getClass() एक या दो निर्देश है।"। इसका अर्थ यह है कि उपर्युक्त कोड Object.getClass() का एक संभावित कार्यान्वयन दिखाता है, लेकिन यह कार्यान्वयन रनटाइम और/या वास्तविक जेवीएम (व्याख्या/जेआईटीटेड, क्लाइंट/सर्वर, ओरेकल मानक/जेआरॉकिट, ...) पर आधारित हो सकता है

+1

यह "साधारण कोड" है जिसे व्याख्या मोड में बुलाया जा सकता है। यह बहुत संभावना है कि हॉटस्पॉट ऑप्टिमाइज़र 'getClass()' विधि को जानते हैं और इसे हॉटस्पॉट में दिखाई देने पर किसी अन्य चीज़ के साथ प्रतिस्थापित करते हैं, परिणाम की भविष्यवाणी करने के लिए आमंत्रण के आस-पास के संदर्भ का उपयोग करके और परिणामस्वरूप आप वास्तव में क्या कर रहे हैं । Https://wikis.oracle.com/display/HotSpotInternals/PerformanceTechniques#PerformanceTechniques-Intrinsics देखें – Holger

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