2013-06-26 12 views
5

मैं कक्षा बनाने के लिए जावासिस्ट का उपयोग करता हूं। और टेस्ट स्वीट, जब एक दूसरे टेस्ट एक ही कक्षा बनाने की कोशिश में, यह pool.makeClass(...) में विफल रहता है क्योंकि वर्ग जमे हुए है (यानी पहले से ही toClass() के माध्यम से बनाया।जावस्सिस्ट: कक्षा को फिर से बनाना - पहले हटाएं, या डिफ्रॉस्ट() और संशोधित करें?

क्या तरीका इस पर काबू पाने के लिए है? आदर्श रूप में, पहला परीक्षण करना चाहिए किसी भी तरह वर्ग को नष्ट - शायद classloader से उतारना -। लेकिन जैसा कि मैंने in JLS पढ़ते हैं, अनलोड आपरेशन विश्वसनीय नहीं है

तो शायद वैकल्पिक हल वर्ग कोड चाहे वह मौजूद बनाने में जांच करने के लिए है, और यह करता है, defrost() यह, सभी सदस्यों को हटा दें, और इसे फिर से बनाएं।

कोई अन्य विचार?

या जवासिस्ट के माध्यम से वर्ग को हटाने के लिए कुछ विश्वसनीय तरीका है?

+0

'क्लासलोडर' से उतारना अविश्वसनीय नहीं है - यह असंभव है। एक वर्ग को अनलोड किया जा सकता है यदि यह * और * इसका 'क्लासलोडर' पहुंच योग्य नहीं हो जाता है, लेकिन चूंकि प्रत्येक वर्ग अपने लोडर को संदर्भित करती है जिसका अर्थ है कि * इस लोडर द्वारा लोड किए गए सभी * वर्ग भी पहुंच योग्य नहीं हो सकते हैं। लेकिन आप एक * अलग * 'क्लासलोडर' का उपयोग कर कक्षा बना सकते हैं। खैर, औपचारिक रूप से यह एक ही नाम (और शायद वही बाइट कोड) के साथ एक अलग वर्ग है। – Holger

+0

ऐसा लगता है कि उत्तर ... यदि आप इसे डालते हैं, तो मैं स्वीकार करूंगा। –

उत्तर

4

आप ClassLoader से एक एकल कक्षा को अनलोड नहीं कर सकते हैं। एक वर्ग को अनलोड किया जा सकता है यदि यह और उसके ClassLoader पहुंच योग्य नहीं हो जाते हैं, लेकिन चूंकि प्रत्येक वर्ग अपने लोडर को संदर्भित करती है जिसका अर्थ है कि इस लोडर द्वारा लोड की गई सभी कक्षाएं भी पहुंच योग्य नहीं होनी चाहिए।

लेकिन आप अलग-अलग ClassLoader का उपयोग कर कक्षा बना सकते हैं। खैर, औपचारिक रूप से यह एक ही नाम (और शायद वही बाइट कोड) के साथ एक अलग वर्ग है। यदि परीक्षण मामले में निष्पादित कोड ढेर में कोई संदर्भ नहीं छोड़ता है, तो ClassLoader और इसकी कक्षाएं परीक्षण के बाद एकत्र की जा सकती हैं।

+0

ठीक है, लेकिन अगर दूसरे क्लासलोडर में लोड की गई कक्षा में प्रथम क्लासलोडर के किसी अन्य वर्ग के संदर्भ हैं, तो क्या हमें दूसरे क्लासलोडर में सभी संदर्भ प्रकार भी जोड़ना चाहिए? – Pooya

+1

@ Пуя: यह कई कारकों पर निर्भर करता है। 'क्लासलोडर' सी 1 द्वारा परिभाषित एक वर्ग में कक्षाओं के संदर्भ हो सकते हैं जो किसी अन्य 'क्लासलोडर' सी 2 द्वारा परिभाषित रनटाइम प्रकारों के लिए हल किए जाते हैं यदि सी 1 संबंधित वर्ग लोडिंग अनुरोधों को सी 2 में प्रस्तुत करता है। यह मानक व्यवहार है यदि सी 2 * सी 1 का * पैरेंट * लोडर है। लेकिन इसका तात्पर्य है कि सी 2 में ये कक्षाएं अपरिवर्तित बनी हुई हैं और सी 2 पहुंच योग्य है और सी 1 का उपयोग होने पर कचरा नहीं किया जा सकता है। इसलिए यदि आप एक साथ कई संबंधित कक्षाओं को संशोधित करना चाहते हैं, तो उन सभी को नए 'क्लासलोडर' में फिर से परिभाषित करना होगा। – Holger

+0

और यदि नए वर्ग के उदाहरण पुराने स्थानों को प्रतिस्थापित करने के लिए हैं, जहां एक सुपर क्लास या इंटरफ़ेस प्रकार की अपेक्षा की जाती है, तो ड्रॉप-इन प्रतिस्थापन की अनुमति देने के लिए उस विशेष बेस प्रकार या इंटरफ़ेस * को उसी रनटाइम प्रकार में हल किया जाना चाहिए। – Holger

0

मैं एक ही समस्या हो, मैं इसे इस तरह से हल हो सकता है, अपने परीक्षण मामले के लिए आवेदन नहीं कर सकते हैं:

CtClass अपने क्लास के एक निजी स्थिर चर करें।

एक ऐसी विधि बनाएं जो जांचती है कि CtClass पहले से ही बनाया गया है या नहीं। यदि सीटी क्लास नहीं बनाया गया है, तो उस विधि को कॉल करें जो इसे बनाता है, अन्यथा, उस सीटी क्लास को वापस करें।

बनाएं कि आपका सभी परीक्षण नई विधि का उपयोग करें।

इसलिए, यदि आपके पास एन टेस्ट है, तो पहले व्यक्ति सीटी क्लास का निर्माण करने का प्रयास करेगा, बाकी के पास स्थिर सीटी क्लास वैरिएबल होगा।

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