2012-05-14 20 views
31

मैं मैं कहाँ पाया getClass() की कि विधि घोषणाहैशकोड() और getClass() देशी विधियां क्यों हैं?

public final native Class<?> getClass(); 

था Object वर्ग के स्रोत कोड और hashCode() की घोषणा

public native int hashCode(); 

था जाँच क्यों कक्षा में native तरीकों इन दो तरीके हैं और मैं उन तरीकों का स्रोत कोड कैसे प्राप्त कर सकता हूं?

+13

डुप्लिकेट नहीं - ओपी जानता है कि मूल क्या है, लेकिन यह जानना चाहता है कि इन दो तरीकों से विशेष रूप से क्या हैं। – Alnitak

+5

हैशकोड() मूल है क्योंकि जिस तरीके से डेटा संग्रहीत किया जाता है, वह असीमित ऑपरेटिंग सिस्टम पर भिन्न हो सकता है। मुझे यकीन नहीं है कि getClass() हालांकि क्यों है; संभवतः बहुरूपता के विभिन्न कार्यान्वयन के कारण। – Vulcan

+1

@ वल्कन getClass() अंतिम है इसलिए आप इसे ओवरराइड नहीं कर सकते हैं और टाइप सिस्टम को तोड़ सकते हैं। – EJP

उत्तर

35

आप देशी तरीकों here

की पूरी स्रोत कोड मुझे आशा है कि यह आपके लिए काम करेंगे पा सकते हैं।

ये मूल विधियां हैं, क्योंकि इसे मशीन से बातचीत करना है। यहां मशीन आश्रित कोड सी भाषा में लिखा गया है, जो Java Runtime Environment (जेआरई) के lib स्थान के स्रोत पैकेज के साथ या rt.jar में नहीं आ रहा है।

देशी होने के लिए एक और कारण संभवतः प्रदर्शन कारणों से है। सी स्तर प्रोग्रामिंग प्रदर्शन के कारण सुधार किया जा सकता है, इसलिए उन्होंने सी भाषा में मूल कोड लिखा होगा।

विधियां मूल हैं क्योंकि वे मूल डेटा की चिंता करते हैं। hashCode विधि ढेर पर किसी ऑब्जेक्ट को पॉइंटर के आंतरिक प्रतिनिधित्व पर निर्भर एक पूर्णांक मान देता है। getClass विधि को आंतरिक vtbl (virtual function table) तक पहुंचना चाहिए जो संकलित प्रोग्राम के वर्ग पदानुक्रम का प्रतिनिधित्व करता है। कोर जावा के साथ इनमें से कोई भी संभव नहीं है।

+1

'हैशकोड विधि एक पूर्णांक मान को ढेर पर किसी ऑब्जेक्ट के पॉइंटर के आंतरिक प्रतिनिधित्व पर निर्भर करता है।' ऐसा लगता है कि यह [स्रोत] (http: //hg.openjdk को देखने से नहीं है। java.net/jdk8/jdk8/hotspot/file/tip/src/share/vm/runtime/synchronizer.cpp#l555)। –

+0

@BrianAgnew अरे, भाई, मैंने कोड अपडेट किया है –

2

इनके लिए जानकारी हेडर (कक्षा के लिए) या कहीं और (हैशकोड के लिए) में है यह जावा में लागू नहीं हो सकता है। इन तरीकों का स्रोत JVM के स्रोत में है। जैसे आप OpenJDK के लिए स्रोत डाउनलोड कर सकते हैं। वस्तु वर्ग के लिए

29

स्रोत कोड पाया जा सकता है here

इस स्रोत() getClass के कार्यान्वयन विधि शामिल (लाइन 58 देखें)। हैशकोड को फ़ंक्शन पॉइंटर JVM_IHashCode के रूप में परिभाषित किया गया है (लाइन 43 देखें)।

JVM_IHashCode jvm.cpp में परिभाषित किया गया है। लाइन 504 से शुरू कोड देखें। यह बदले में ऑब्जेक्ट सिंक्रनाइज़र :: FastHashCode को कॉल करता है जिसे synchronizer.cpp में परिभाषित किया गया है। लाइन 576 पर फास्टहाशकोड के कार्यान्वयन और लाइन 530 पर get_next_hash देखें।

शायद, विधियों प्रदर्शन के लिए मूल हैं और व्यावहारिक मुद्दों w.r.t कार्यान्वयन के कारण हैं।

उदाहरण के लिए, जावाडॉक्स से, हैशकोड आमतौर पर "वस्तु के आंतरिक पते को पूर्णांक में परिवर्तित करके" लागू किया जाता है। यह आंतरिक पता जावा एसडीके के माध्यम से उपलब्ध नहीं है और इसे मूल विधि के रूप में लागू किया जाना होगा।

कृपया Is it possible to find the source for a Java native method? पढ़ें। इस ब्लॉग पोस्ट Object.hashCode implementation को भी पढ़ें। यह अधिक जानकारी देता है। लेकिन गलत धारणा है कि हैशकोड वस्तु की पहचान से उत्पन्न नहीं होता है।

उम्मीद है कि यह मदद करता है।

+0

फिर हम कैसे कह सकते हैं कि जेवीएम प्लेटफार्म स्वतंत्र है? –

+0

यह ब्रेक प्लेटफॉर्म आजादी कैसे होगी? किसी ऑब्जेक्ट के लिए, हैशकोड प्लेटफॉर्म पर समान होने की आवश्यकता नहीं है। उस मामले के लिए, यह अलग-अलग रनों में, एक ही मंच पर भी समान नहीं होगा। सार्वजनिक कक्षा टेस्ट हैशकोड { सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग [] तर्क) { ऑब्जेक्ट ओ = नया ऑब्जेक्ट(); System.out.println (o.hashCode()); } } – krishnakumarp

+1

@ भविक अंबानी यह शब्दावली नाइटपिकिंग है, लेकिन * जेवीएम * प्लेटफ़ॉर्म स्वतंत्र नहीं है, बल्कि प्लेटफ़ॉर्म-निर्भर भाग है, जो किसी दिए गए प्लेटफ़ॉर्म पर प्लेटफार्म स्वतंत्र जावा बाइटकोड निष्पादित करता है। – hyde

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