2012-02-15 14 views
9

सी # वह भाषा है जिसके साथ मैं सबसे अधिक आरामदायक हूं लेकिन काम पर जावा करता हूं। मुझे लगता है कि आप कह सकते हैं कि मैं विजुअल स्टूडियो आईडीई का उपयोग करने में बहुत सहज हूं। अपने डीबगर के बारे में मैंने जो चीजों का आनंद लिया उनमें से एक यह है कि मैं अभिव्यक्ति के लिए घड़ी चर ("ग्रहण में अभिव्यक्ति") डाल सकता हूं। तो मैं विशिष्ट क्षेत्रों के मूल्यों पर सार्वजनिक या गैर-सार्वजनिक, कॉल विधियों इत्यादि के मूल्यों पर एक झलक ले सकता हूं, क्योंकि मैं डिबगिंग कर रहा हूं।डीबगिंग करते समय मैं आईडीई में सीधे अन्य वस्तुओं के निजी फ़ील्ड कैसे देख सकता हूं?

ऐसा प्रतीत नहीं होता कि मैं ग्रहण में ऐसा ही कर सकता हूं। मुझे क्षेत्र के लिए संबंधित गेटर विधि को कॉल करने का सहारा लेना है (मान लीजिए कि इसमें एक है)। यदि इसमें कोई नहीं है, तो मुझे या तो अस्थायी रूप से एक जोड़ना होगा ताकि मैं इसे देख सकूं और इसे पूरा करने के दौरान इसे निकालना याद रखूं या मैं केवल एसओएल हूं।

मैं अपने किसी निजी क्षेत्र में किसी ऑब्जेक्ट के लिए घड़ी अभिव्यक्ति कैसे डाल सकता हूं? या क्या मैं इसे गलत कर रहा हूं और मुझे उन्हें देखने के लिए विशेष अभिव्यक्ति तैयार करना है?
(या वहाँ मुझे जानकारी है कि मैं चाहता हूँ पाने के लिए एक बेहतर तरीका है?)

जैसे

मैं एक HttpServletRequest है और requestURI पर नजर रखना चाहते हैं। अगर मैं अनुरोध चर देखता हूं, तो यह अपने कई क्षेत्रों को सूचीबद्ध करता है और यह बहुत अधिक जानकारी है। मुझे ऑब्जेक्ट में केवल एक चीज में दिलचस्पी है ताकि इसे कम किया जा सके, मैं उस चीज़ के लिए एक घड़ी अभिव्यक्ति जोड़ना चाहता हूं।

फ़ील्ड का नाम स्पष्ट रूप से requestURI है इसलिए मैंने अभिव्यक्ति को जोड़ा: request.requestURI। ग्रहण एक त्रुटि कहता है कि यह एक क्षेत्र नहीं है (यह है, यह सिर्फ सार्वजनिक नहीं है)। सीधे मैदान में जाने के बजाय, मुझे गेटर पर जाना पड़ा: request.getRequestURI() और यह ठीक काम करता है। लेकिन मैं हमेशा उपलब्ध होने वाले गेटर पर भरोसा नहीं कर सकता।

the variables view
चर जबकि डीबगिंग, आप एक चर पर राइट क्लिक करें और घड़ी मेनू आइटम पर क्लिक कर सकते हैं

the expressions view
भाव दृश्य

+1

ज़रूर, आप कर सकते हैं कि आईडीई के Netbeans/ग्रहण/Intellij में से किसी में ... –

+1

+1 विशुद्ध स्क्रीनशॉट के लिए;) – berry120

उत्तर

7

ग्रहण Declared Type के निजी/संरक्षित क्षेत्रों पर विचार करते हुए अभिव्यक्ति का मूल्यांकन करता है, Actual Type नहीं।

उदाहरण:

Number n1 = new Integer(1000); 
Integer n2 = new Integer(1000); 

भाव:

n1.value can't be evaluate 
n2.value returns 1000, perfectly 

एक वैकल्पिक DetailFormatter (चर> नया विस्तार फ़ॉर्मेटर में राइट क्लिक करें) का उपयोग है।

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

आपका DetailFormatter (ApplicationHttpRequest के लिए) हो सकता है:

requestURI 

या

"URI: " + requestURI + "\n" + 
"Path: " + servletPath 
+0

यह अंतर्दृष्टि के लिए एक दिलचस्प बिंदु धन्यवाद है। हालांकि यह बहुत बुरा है, यह स्वयं को समझने के लिए पर्याप्त स्मार्ट नहीं है। वे निश्चित रूप से करने में सक्षम होना चाहिए था। –

+0

मुझे लगता है कि इस जवाब ने स्थिति को सबसे अच्छी तरह समझाया। निश्चित रूप से कलाकार मदद करता है, लेकिन यह बताता है कि क्यों बेहतर है। –

+0

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

0

देखने ग्रहण में। डीबग परिप्रेक्ष्य में यह एक अभिव्यक्ति टैब जोड़ देगा जिसमें आपके द्वारा देखे जा रहे चर की एक सूची होगी। मुझे यकीन नहीं है कि इसे अन्य आईडीई में कैसे किया जाए।

+0

हाँ मुझे पता है लेकिन यह मुद्दा नहीं है ... मैं एक चर के एक निजी क्षेत्र को देखना चाहता हूं ... ग्रहण स्पष्ट रूप से ऐसा नहीं कर सकता है। –

5

कोई फर्क नहीं पड़ता कि फ़ील्ड private या protected है, ग्रहण अभिव्यक्ति सही ढंग से मूल्यांकन करेगी। लेकिन परिवर्तनीय मामलों का दायरा।

अगर मैं गलत हूं तो मुझे सुधारें।

requestURIorg.apache.catalina.core.ApplicationHttpRequest में एक संरक्षित क्षेत्र है जो HttpServletRequest लागू करता है। आपके मामले में परिवर्तनीय request प्रकार HttpServletRequest प्रकार है और आप HttpServletRequest.requestURI तक पहुंचने का प्रयास कर रहे हैं और यह फ़ील्ड मौजूद नहीं है और ग्रहण विफल रहता है। मुझे लगता है कि यह सामान्य है। हो सकता है कि आप उचित कास्टिंग करें, अभिव्यक्ति सही ढंग से मूल्यांकन करेगी।

+0

अनुरोध ऑब्जेक्ट का प्रकार वास्तव में 'org.apache.catalina.connector.RequestFacade' है। लेकिन फिर भी, इसे कास्टिंग अभी भी काम नहीं करता है। (यह "समस्या" को हल करने के लिए एक _ugly_ तरीका होगा) –

+0

असल में, मुझे लगता है कि टाइटो इस प्रकार के बारे में सही है। आपके चर दृश्य में कॉलम 2 "मान" कॉलम है, है ना? जहां तक ​​मुझे पता है, वह कॉलम ठोस प्रकार दिखाएगा, और यह ApplicationHttpRequest दिखाता है, अनुरोध Facade नहीं। – sharakan

+0

आह क्षमा करें, मेरी पहली टिप्पणी को अनदेखा करें। मेरी वर्तमान स्थिति में अभी अनुरोध अनुरोध है कि 'RequestFacade' (स्ट्रेट एक्शन के भीतर)। मुझे एहसास नहीं हुआ कि यह मेरे स्क्रीनशॉट (सर्वलेट के भीतर) में समान नहीं था। मुझे मौका मिलने पर मुझे इसका पुनर्मूल्यांकन करना होगा। –

1

अभिव्यक्ति दृश्य में एक अभिव्यक्ति लिखना जैसे मूल्यांकन किया गया है जैसे आपने कोड की एक पंक्ति लिखी है, और वर्तमान में हाइलाइट की गई रेखा से पहले इसे निष्पादित किया है।एक अंतर है जिसे मैं जानता हूं (शायद दूसरों को, लेकिन यह महत्वपूर्ण है) जो कि आप क्लास एक्सेसर दृश्यता प्रतिबंधों को बाईपास कर सकते हैं, और निजी, संरक्षित और डिफ़ॉल्ट सदस्यों को देख सकते हैं जो मौजूदा स्टैक फ्रेम शायद नहीं कर सके।

ने कहा कि अभिव्यक्ति के लिए आपको सही प्रकार का संदर्भ होना आवश्यक है। यदि आपने कोड को कोड में डाला है, तो जावा कंपाइलर शिकायत करेगा कि requestURI HttpServletRequest का एक क्षेत्र नहीं है। और इसलिए, आपको कक्षा (या उप-वर्ग) में डालने की ज़रूरत है जो वास्तव में फ़ील्ड घोषित करता है: ApplicationHttpRequest।

अब, वे अभिव्यक्तियों में एक ही जादू को उजागर करने के लिए परेशान क्यों नहीं करते थे क्योंकि वे वेरिएबल्स में करते हैं, जहां आप बताते हैं कि वे ठोस वर्ग के सभी सदस्यों को सूचीबद्ध करते हैं, भले ही घोषित प्रकार उन्हें नहीं दिखाए, मैं नहीं कर सका ' टी मत कहो।

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

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