2011-01-10 8 views
5

कहता है कि मेरे पास यह चर है:जावा में एक चर के ढेर पर पता प्राप्त करना संभव है?

... 
Somekindofobject var = new Somekindofobject(); 
... 

और मैं जानना चाहता हूं कि ढेर पर var कहां स्थित है (पता, जैसे 0x08 और इसी तरह), और पता मुद्रित करने के लिए।

क्या यह संभव है?

+0

यदि आप ऑब्जेक्ट प्रिंट करना चाहते हैं, तो आप यह जानकर क्या लाभ प्राप्त करते हैं कि यह ढेर पर कहां है? आप वास्तव में क्या करने की कोशिश कर रहे हैं? – Anon

+0

@ आओन: मुझे लगता है कि उसका मतलब पता है कि पता प्रिंट करें। –

+0

मैं ऐसे प्रोग्राम पर काम कर रहा हूं जो इनपुट जावा प्रोग्राम के रूप में प्राप्त हो, और वेरिएबल कोड जो परिवर्तनीय पहुंच के बारे में फ़ाइल जानकारी को प्रिंट करता है। एकमात्र तरीका जिसे मैं एक ही कक्षा के ऑब्जेक्ट्स के दो क्षेत्रों के बीच निर्धारित कर सकता हूं, ढेर पर अपने पते से है। इसलिए, मुझे हेप – RanZilber

उत्तर

8

मैं एक प्रोग्राम है जो इनपुट जावा कार्यक्रम के रूप में हो जाता है पर उपकरणों कोड है कि बाहर प्रिंट चर का उपयोग के बारे में जानकारी दायर करने के लिए काम कर रहा हूँ, और। एकमात्र तरीका है जिसे मैं के बीच निर्धारित कर सकता हूं, उसी कक्षा के ऑब्जेक्ट्स के दो फ़ील्ड ढेर पर अपने पते से है। इसलिए, मैं ढेर

पर पता की जरूरत है आप System.identityHashCode उपयोग कर सकते हैं समानता की एक धारणा मिलता है। यह सही नहीं है, लेकिन यह बहुत अच्छा है। यदि आपको किसी ऑब्जेक्ट का ढेर पता मिलता है, तो याद रखें कि JVM को ऑब्जेक्ट्स को स्थानांतरित करने की अनुमति है (और अक्सर जब एक पीढ़ी के कचरा कलेक्टर एक पुरानी पीढ़ी के लिए एक लंबे समय तक जीवित वस्तु को बढ़ावा देता है) तो किसी ऑब्जेक्ट का ढेर स्थान नहीं है सभी परिस्थितियों में पहचान के लिए एक अच्छी प्रॉक्सी।

+0

यह शायद 32 बिट सिस्टम पर ओपी की समस्या को बहुत अच्छी तरह से हल करेगा। – irreputable

+0

System.identityHashCode आजकल प्रति थ्रेड बीज – bestsss

+0

के साथ यादृच्छिक जनरेटर पर आधारित है, क्या आप विस्तृत कर सकते हैं? System.idenetityHashCode (var) मुझे क्या देता है? मुझे कुछ ऐसी चीज चाहिए जो मुझे एक ही कक्षा के एक अलग वर्ग पर एक ही क्षेत्र के बीच निर्धारित करने की अनुमति देगी। – RanZilber

3

आप javaPaper के इस लेख पर एक कोशिश दे सकता है।

+0

बिल्कुल डरावना। नोट * असुरक्षित * (नाम किसी कारण के लिए चुना गया था) और * sun.misc * (एक "निजी" कार्यान्वयन-विशिष्ट पैकेज)। यह भी ध्यान दें कि यह * तार्किक * पते के लिए है, न कि * भौतिक * पता। एक दिलचस्प लेख के लिए +1। असुरक्षित के लिए –

+0

+1, यह अच्छा है। – bestsss

+1

यह आपको किसी ऑब्जेक्ट के भीतर फ़ील्ड का पता देगा, लेकिन वह स्वयं को ऑब्जेक्ट नहीं करेगा। –

1

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

1

जैसा कि असुरक्षित उल्लेख किया गया है ... उपयोगी (मैंने इसे खुद को उत्पादन वातावरण में उपयोग किया है)। एक और समाधान है जो जावा पता को देशी सूचक के रूप में वापस नहीं करेगा जिसे इसे सीधे java.nio.ByteBuffer कहा जाता है, इसे ठीक उसी विचार के साथ डिजाइन किया गया है। यह सीधे बाइट बफर द्वारा स्मृति आवंटित किया गया है जावा ढेर में आवंटित नहीं है और यह मानक कचरा संग्रह का विषय नहीं है। फिर, बेशक, बाइटबफर बाइटबफर के माध्यम से प्रत्यक्ष सूचक प्रदान करता है। एड्रेस()

+0

जो मुझे यहां चाहिए, क्योंकि मुझे इनपुट कोड प्राप्त करने के बारे में कोई जानकारी नहीं है। लेकिन मुझे यह विचार पसंद है, तो +1; – RanZilber

0

अपने लक्ष्यों को देखते हुए, मुझे लगता है कि एकमात्र समाधान JVMTI है। आप {SetTag} ऑपरेशन का उपयोग करके प्रत्येक ऑब्जेक्ट के साथ एक अद्वितीय पहचानकर्ता को संबद्ध करेंगे। फिर {FieldModification} घटनाओं के लिए सुनो।

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