2010-08-15 17 views
17

मैं अपने कार्यक्रमों में से किसी एक में एक बग को ठीक करने की कोशिश कर रहा हूं, जो मुझे लगता है कि हाइबरनेट के कारण यह पता लगाना चाहिए कि किसी ऑब्जेक्ट के इंस्टेंस को तत्काल (या किसी अन्य) कन्स्ट्रक्टर को कॉल किए बिना किसी ऑब्जेक्ट को तुरंत कैसे चालू किया जाए।क्या कन्स्ट्रक्टर को कॉल किए बिना जावा में किसी ऑब्जेक्ट का उदाहरण बनाना संभव है?

+3

आपको संभावित समाधान की बजाय मूल समस्या पोस्ट करनी चाहिए। –

+2

हाइबरनेट इकाइयों के डिफ़ॉल्ट खाली कन्स्ट्रक्टर का उपयोग करता है। आप गलत रास्ते पर हैं। इसके बजाय अपनी समस्या पोस्ट करें। –

उत्तर

23

असल में, हाँ, जब आप ऑब्जेक्ट को तत्काल बनाते हैं तो कन्स्ट्रक्टर को बाईपास करना संभव है, यदि आप ऑब्जेक्ट को तुरंत चालू करने के लिए objenesis का उपयोग करते हैं। यह प्राप्त करने के लिए बाइटकोड मैनिप्लेशंस करता है।

किसी ऑब्जेक्ट को Deserializing भी निर्माता को बाईपास करेगा।

प्रतिबिंब का उपयोग करके ऐसा करना संभव नहीं है।

7

हां, किसी ऑब्जेक्ट को deserializing अपने कन्स्ट्रक्टर का आह्वान नहीं करता है।

उसने कहा, मुझे नहीं लगता कि क्यों हाइबरनेट एक ऑब्जेक्ट को क्रमबद्ध करेगा, जब तक कि दूसरे स्तर के कैश में न हो।

6

Deserialization में एक कन्स्ट्रक्टर का आह्वान किए बिना ऑब्जेक्ट्स बनाना शामिल है।

यह प्रोग्रामेटिक रूप से करने के लिए संभव है (कम से कम सूर्य/ओरेकल जेडीके के साथ)। यह "Creating Objects Without Calling Constructors" में शामिल था, The Java Specialists' Newsletter. का एक संस्करण इसमें sun.* पैकेजों से कक्षाओं का उपयोग करना शामिल है, इसलिए पोर्टेबल नहीं है।

8

बस तस्वीर को पूरा करने के लिए: एक नई वस्तु बनाने के लिए विधि clone का उपयोग करके रचनाकारों को भी बाईपास करता है।

+0

बशर्ते कि क्लोन() सही ढंग से लागू किया गया हो। Super.clone() का उपयोग न करने वाली फ़ैक्टरी विधि के रूप में कार्य करने के लिए क्लोन को ओवरराइड करना संभव है। (जबकि super.clone() का उपयोग किया जाना चाहिए - निर्माता नहीं) – DerMike

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

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