2011-09-13 11 views
5

के बराबर नहीं है हमारे पास कक्षा की वस्तुओं के साथ एक कैश (Map) है। एक और classloader initializes/रनटाइम पर भार TestClass फिर से है, तो नीचे दिए गए कोड एक ClassCastException फेंक दिया जाएगा:कक्षा ए कक्षा ए

TestClass obj1 = (TestClass)map.get("key"); // throws a ClassCastException 

ClassCastException when casting to the same class

ठीक है, मैं इस बिंदु तक इस मुद्दे को समझते हैं।

तो, मैं पृष्ठभूमि जानकारी खोजने की कोशिश कर रहा था क्यों TestClass.classTestClass.class के बराबर नहीं है। मुझे लगता है कि अलग-अलग क्लासलोडर ने संदर्भ प्रकार में एक अलग आईडी सेट की है? कोई भी मुझे पृष्ठभूमि की व्याख्या करने में सक्षम है?

बेस्ट पेज मैंने पाया: http://www.objectsource.com/j2eechapters/Ch21-ClassLoaders_and_J2EE.htm

उत्तर

8

हाँ, सही दिशा करने के लिए अपने अनुसंधान अंक: एक ही कक्षा परिभाषा अलग वर्ग लोडर द्वारा लोड JVM द्वारा दो अलग वर्गों के रूप में देखा जाता है। इस प्रकार उनके बीच कास्टिंग ClassCastException के साथ विफल रहता है।

मुझे लगता है कि अंतर केवल इसलिए है क्योंकि खेल में दो अलग-अलग वर्ग टोकन ऑब्जेक्ट्स हैं। यह इस तरह होना चाहिए, क्योंकि अलग-अलग लोडर द्वारा लोड की गई कक्षाएं वास्तव में एक ही कक्षा के विभिन्न संस्करण हो सकती हैं। यह ज्ञात है कि प्रत्येक वर्ग के लिए वर्ग टोकन अद्वितीय है (उसी क्लासलोडर दायरे में, वह है)। यदि जेवीएम ने भौतिक समानता (==) के बजाए कक्षा के टोकन की तुलना अपने विभिन्न विशेषताओं से तुलना करना शुरू कर दिया है तो यह कीड़े का एक खुल जाएगा।

1

आपने जो अनुभव किया वह कस्टम क्लास लोडर मौजूद है। वे एक ही नाम के साथ एक ही नाम के साथ एक वर्ग में विभिन्न वर्ग लोड करने की अनुमति देते हैं। एक जेवीएम में एक वर्ग की पहचान कक्षा नाम और कक्षा लोडर से युक्त tuple द्वारा दिया जाता है। भाषा जावा में एक वर्ग की पहचान पूरी तरह से योग्य नाम से की जाती है।

1

कोई भी मुझे पृष्ठभूमि समझा सकता है?

जैसा कि पीटर टोरोक ने पहले ही समझाया है कि विभिन्न क्लासलोडर्स से लोड होने पर उन्हें अलग माना जाता है। पृष्ठभूमि यह है कि एक एप्लिकेशन सर्वर किसी अनुप्रयोग के विभिन्न संस्करणों का समर्थन करने में सक्षम होना चाहिए उदा। आपके कान-फाइलों में समान पुस्तकालयों के विभिन्न संस्करण शामिल थे।

1

कोई रहस्य नहीं है। इस प्रकार प्रकार के क्रम समानता जावा भाषा विशिष्टता में परिभाषित किया गया है:।

"रन समय, एक ही द्विआधारी नाम के साथ कई संदर्भ प्रकार अलग-अलग वर्ग लोडर द्वारा एक साथ लोड किया जा सकता है इन प्रकार के या प्रतिनिधित्व नहीं हो सकता है एक ही प्रकार की घोषणा। यहां तक ​​कि यदि दो ऐसे प्रकार एक ही प्रकार की घोषणा का प्रतिनिधित्व करते हैं, तो उन्हें अलग माना जाता है। "

JLS 4.3.4 - When reference types are the same। (दूसरा अनुच्छेद)