संपादित करें: The ticket I've linked in this answer को सत्यापित/निश्चित चिह्नित किया गया है। इसे नवीनतम ऑक्सीजन रिलीज, as detailed in the release notes में एकीकृत किया गया है।मैं अपना मूल उत्तर नीचे छोड़ दूंगा क्योंकि इस बारे में बहुत उपयोगी जानकारी है कि जेडीआई और जेडीटी ग्रहण में कैसे मिलकर काम करते हैं।
मैं आपके प्रश्न के अंतिम उत्तर से शुरू करने जा रहा हूं, इसलिए यदि आप नहीं चाहते हैं तो आपको विवरण पढ़ने की आवश्यकता नहीं है। असल में, यह एक तरह का संभव है लेकिन बहुत से प्रश्नों के साथ पहले जवाब देना होगा। यदि आप इसे छोड़ना चाहते हैं और सीधे टिकट पर जाना चाहते हैं, here you go, लेकिन मैं आपको पढ़ने की सलाह देता हूं।
ग्रहण JVM के साथ वॉचपॉइंट्स पंजीकृत करने के लिए JDI (उस पृष्ठ के बहुत नीचे) का उपयोग करता है। यह EventRequestManager
विधियों के माध्यम से किया जाता है (कार्यान्वयन JVM स्वयं द्वारा प्रदान किया जाता है, ग्रहण नहीं) जो घड़ी बिंदु बनाते हैं, यानी EventRequstManager.createModificationWatchpointRequest
। इन तरीकों को स्वीकार करने वाली एकमात्र चीज Field
है (ध्यान दें कि यह प्रतिबिंबित Field
वर्ग नहीं है)। तो संक्षेप में, ग्रहण सीधे जावा के माध्यम से नहीं कर सकता है। कभी डर नहीं, जावा सशर्त ब्रेकपॉइंट्स को संभाल नहीं करता है। जावा पर भरोसा करने के बजाए उन्हें सीधे ग्रहण के माध्यम से भी लागू किया जाता है। हालांकि, कुछ चेतावनियां हैं जो सशर्त ब्रेकपॉइंट्स की तुलना में सशर्त घड़ी को लागू करने के लिए और अधिक कठिन बनाती हैं।
चलो सादे, सशर्त ब्रेकपॉइंट्स पर विचार करें। उन्हें काम करने के लिए, आपको एक संदर्भ की आवश्यकता है जिसमें आप कोड स्निपेट निष्पादित कर सकते हैं। कोड के निष्पादन संदर्भ के बिना, हम स्निपेट में अभिव्यक्ति/कथन का मूल्यांकन नहीं कर सकते हैं क्योंकि हमारे पास चर, मान, प्रकार इत्यादि को हल करने का कोई तरीका नहीं है। यह AST पार्सर का उपयोग करके किया जाता है जो जावा कोड को वास्तविक निर्देशों में संसाधित करता है । याद रखें कि आप एक शर्त में कई कथन टाइप कर सकते हैं, केवल एक अभिव्यक्ति नहीं। इसके बाद मूल्यांकनकर्ता इसे संदर्भित करने के बाद अभिव्यक्ति का मूल्यांकन करने के लिए एक संदर्भ (विशेष रूप से, IJavaStackFrame
) का उपयोग करता है।
अब एक सशर्त दृष्टिकोण के बारे में सोचें, क्योंकि यह अंतिम बिंदु बहुत महत्वपूर्ण है। वॉचपॉइंट के निष्पादन संदर्भ क्या है? परिवर्तनीय पहुंच न केवल एक ही कक्षा के भीतर हो सकती है, बल्कि अन्य कक्षाओं में भी हो सकती है (protected
और पैकेज सदस्यों को सोचें), और आंतरिक कक्षाओं में भी (MyClass.this.myField
के माध्यम से)। इसका मतलब है कि:
- स्थानीय चर कभी नहीं संगत क्षेत्र विभिन्न तरीकों से पहुँचा जा सकता के बाद से कर रहे हैं लगातार क्षेत्र से पहुँचा जा सकता के बाद से कर रहे हैं,
- जहाँ से का उपयोग शुरू हो जाती है वर्ग के सदस्य चर कभी नहीं एकाधिक कक्षाएं,
- निष्पादन संदर्भ में उपलब्ध आयातित वर्ग कभी भी (2), और
- फ़ील्ड की पहुंच कभी भी संगत नहीं होती है क्योंकि इसे किसी उदाहरण के साथ योग्यता की आवश्यकता हो सकती है, वर्ग का नाम,
super
याजैसे कुछ के साथ 210 (आंतरिक कक्षा के उपयोग के लिए)।
ऐसी सुविधा की व्यवहार्यता सीमित है। वास्तव में निष्पादन संदर्भ में बिल्कुल कुछ भी सुसंगत होने के बाद से आप एक दृष्टिकोण के लिए एक गैर-बदलते सशर्त बयान का मूल्यांकन करने के लिए कड़ी मेहनत करेंगे। इसका मतलब है कि कोड को आसानी से पार्स नहीं किया जा सकता है और विशेष अर्थ के बिना व्याख्या की तरह के रूप में कोड के टुकड़े, के लिए लागू:
myField
हमेशा की तरह, this.myField
या super.myField
या MyClass.myField
या MyClass.this.myField
रूप में ही है पर जहां क्षेत्र है निर्भर करता है पहुंचा जा रहा है
यह चीजों को काफी जटिल करता है, खासकर ऐसी प्रणाली में जो अपेक्षाकृत जटिल है। सशर्त ब्रेकपॉइंट कोड का एक उदाहरण here पाया जा सकता है (Ctrl + F का उपयोग कर getEvaluationEngine
के लिए खोजें)। अब इसे लें और नियमों के एक सेट के आधार पर अभिव्यक्ति पर प्री-प्रोसेसिंग में जोड़ें जहां हम हैं और जहां क्षेत्र है, और चीजें करने से जटिल हो सकता है।
AFAIK, आप कुछ ऐसा नहीं कर सकते हैं, "यदि पुराना/नया मान यह है, तो निलंबित करें", क्योंकि वह जानकारी केवल स्टैक फ्रेम में प्राप्त जानकारी से उपलब्ध नहीं है (और इस प्रकार से डिबगर)। मूल्य को आवंटित अभिव्यक्ति का मूल्यांकन घड़ी के समय के हिसाब से किया गया है, लेकिन इसका परिणाम डीबगर के लिए उपलब्ध नहीं है, इसलिए यह दृष्टिकोण के आधार पर मूल्यांकनकर्ता के लिए उपलब्ध नहीं है। असाइनमेंट करने के लिए पहले एक कदम किया जाना होगा, फिर अभिव्यक्ति को चरण के बाद मूल्यांकन करना होगा। यह बहुत गन्दा होगा, और ईमानदारी से, उस पर हैकी।
किसी भी मामले में, यदि आप इस सुविधा के लिए अपना समर्थन आवाज देना चाहते हैं, तो आप this Eclipse ticket का उपयोग कर सकते हैं। हालांकि, यह 2005 के बाद से रहा है (अब तक 8 साल) और समुदाय से सीमित समर्थन है। टीबीएच, मुझे यह बहुत दूर नहीं दिख रहा है, विशेष रूप से इस तरह के फीचर अनुरोध के पीछे अपेक्षाओं के अधिक स्पष्टीकरण के बिना और इसके पीछे कुछ प्रमुख डिजाइन विचारों के बिना।
जो आप खोज रहे हैं वह एक [संपत्ति परिवर्तन श्रोता] (http://docs.oracle.com/javase/tutorial/uiswing/events/propertychangelistener.html) जैसा है जो आपको एक विशिष्ट परिवर्तन का पता लगाने देगा और स्टैक ट्रेस कैप्चर करें। मुझे विश्वास नहीं है कि यह अभी तक किसी भी डीबगर में उपलब्ध है, और मूल पुस्तकालय डेवलपर्स ने इसे संपत्ति में नहीं बनाया है, तो इसे कार्यान्वित करना मुश्किल होगा। – Cebence