2008-11-27 17 views
5

में उपरोक्त विधियों के लिए इसे पुनर्प्राप्त करें आप निष्पादन वर्ग के संदर्भ में वर्तमान स्टैक फ्रेम के ऊपर कई स्टैक फ्रेम का संदर्भ कैसे प्राप्त करेंगे? उदाहरण के लिए, यदि आपके पास:जावा: स्टैक

Class a { 
    foo() { 
     new b().bar(); 
    } 
} 

Class b { 
    bar() { 
     ... 
    } 
} 

वहाँ मूल्य का उपयोग करके प्राप्त किया जा होगा प्राप्त करने के लिए एक तरह से 'इस' foo में() धागा बार निष्पादित हो रहा है, जबकि() है?

+0

यह मुझे लगता है जैसे आप किसी निश्चित समस्या को हल करने के लिए इसका उपयोग करने का प्रयास कर रहे हैं। क्या आप हमें बता सकते हैं कि आप वास्तव में किस समस्या को हल करने की कोशिश कर रहे हैं? असली समस्या के लिए एक आसान समाधान की संभावना है। –

+0

@matt b: मैं सिर्फ इस टिप्पणी को पोस्ट करने वाला था – Claudiu

उत्तर

1

नहीं, आप नहीं कर सकते। उन सभी भाषाओं में जो एक स्टैक का उपयोग करते हैं, जिन्हें मैं जानता हूं, अन्य स्टैक फ्रेम की सामग्री आपके से छिपी हुई है। इसे प्राप्त करने के लिए कुछ चीजें हैं जो इसे पैरामीटर के रूप में स्पष्ट रूप से पास करने से परे हैं। पहलू उन्मुख ढांचे में से एक आपको कुछ प्राप्त कर सकता है। साथ ही, आप Thread.getStackTrace() से कुछ डीबगिंग जानकारी प्राप्त कर सकते हैं।

+1

स्मॉलॉक में, यह कॉन्टेक्स्ट आपको ढेर के लिए एक हैंडल देता है। आप किसी भी तरह से ढेर में हेरफेर कर सकते हैं। इस प्रकार निरंतरता को लागू करने के लिए समुद्रतट (वेबपैप ढांचे) में उपयोग किया जाता है और इस प्रकार कई वेबपृष्ठों या यहां तक ​​कि पूरी वेबसाइट के पूरे प्रवाह को एक विधि में लागू किया जाता है! – akuhn

0

this हमेशा वस्तु के वर्तमान उदाहरण का संदर्भ है। तो thisfoo() में कोई भी उपयोग कक्षा ए

+0

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

0

का एक उदाहरण लौटाएगा, मुझे लगता है कि जावा विधियों को आमतौर पर कॉल स्टैक तक सीधे पहुंचने की अनुमति नहीं है।

सुरक्षा दृष्टिकोण से, आप एक एपीआई फ़ंक्शन संभावित रूप से कॉलर के डेटा तक पहुंच नहीं चाहते हैं।

1

जैसा कि अन्य लोगों ने कहा है, आप चाहते हैं कि आपकी निचली विधि उच्च विधि के वर्ग के उदाहरण को पारित करे और इसे इस तरह से प्राप्त करें।

उदाहरण के लिए:

Class A { 
    foo() { 
     new b().bar(this); 
    } 
} 

Class B { 
    bar(A aInstance) { 
     ... 
    } 
} 
1

आप तीन विकल्प। आप बार विधि में बुला वस्तु पारित कर सकते हैं:

Class A { 
    foo() { 
     new B().bar(this); 
    } 
} 

Class B { 
    bar(A caller) { 
     ... 
    } 
} 

या आप वर्ग बी क्लास ए की एक आंतरिक वर्ग बना सकते हैं:

Class A { 
    foo() { 
     new B().bar(); 
    } 

    Class B { 
     bar() { 
      A caller=A.this; 
      ... 
     } 
    } 
} 

तो आप सभी की जरूरत क्लास वस्तु उदाहरण के बजाय है , आपके पास तीसरी पसंद है। Thread.currentThread().getStackTrace() का उपयोग करके, आप स्टैक में मनमानी बिंदु पर कक्षा का योग्य नाम प्राप्त कर सकते हैं, और कक्षा उदाहरण प्राप्त करने के लिए प्रतिबिंब का उपयोग कर सकते हैं। लेकिन यह इतना भयानक है, आपको या तो अपना डिज़ाइन ठीक करना चाहिए, या (यदि आप अपना खुद का डीबगर या कुछ इसी तरह लिख रहे हैं) एक सरल परियोजना का प्रयास करें जब तक कि आप इस तरह की चीज को अपने आप के लिए समझने के लिए जावा के बारे में पर्याप्त नहीं जानते ...

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