2009-06-26 11 views
9

क्या आपने कभी जावा में self modifying code बनाया है या सामना किया है? यदि हां, तो कृपया लिंक पोस्ट करें या बस कोड पोस्ट करें।जावा में स्वयं संशोधित कोड

+0

यदि संभव हो तो कृपया कोड पोस्ट करें या –

उत्तर

9

दुःख की दुनिया को अनदेखा कर आप स्वयं को संशोधित कोड के माध्यम से उत्पन्न कर सकते हैं (!), मुझे लगता है वहाँ 3 विकल्प हैं:

  1. जावा 6 की इनबिल्ट संकलक समर्थन का उपयोग करें और लिखने/recompile/पुनः लोड कक्षाएं
  2. अपाचे BCEL बाईटकोड हेरफेर पुस्तकालय का उपयोग अपनी कक्षा सीधे
  3. लिखने के लिए जावा 6 के इनबिल्ट पटकथा समर्थन का इस्तेमाल करते हैं (या अपाचे BSF का उपयोग करें) अपनी पसंद के JVM पटकथा भाषा में तरीकों लिखने के लिए, और इन
ऊपर तीन के

निष्पादित, मेरी प्रारंभिक विकल्प (आवश्यकताओं के अभाव में) होगा टा करने के लिए हो के विकल्प 3 पर एक नज़र डालें। मुझे संदेह है कि यह शुरू करने का सबसे दर्दनाक तरीका है। मैंने उपरोक्त सभी का उपयोग किया है - दुर्भाग्य से मैं क्लाइंट कोड के लिंक पोस्ट नहीं कर सकता।

+0

बीसीईएल के बजाय ऑब्जेक्टवेब एएसएम [http://asm.ow2.org/] का उपयोग करें – KitsuneYMG

1

यह महसूस करना मुश्किल होना चाहिए। लेकिन आप रनटाइम नई कक्षाओं में बना सकते हैं और उन्हें कस्टम क्लासलोडर के साथ लोड कर सकते हैं। यदि आप कोड को फिर से संशोधित करना चाहते हैं, तो आपको कक्षा को फिर से लोड करना होगा।

+0

लिंक करें जो काफी फैक्ट्री विधि होगी! – akf

-2

तुम हमेशा सिर्फ एक गतिशील भाषा इस्तेमाल कर सकते हैं ...

+0

मुझे लगता है कि यह प्रश्न ऊबड़ से बाहर पोस्ट किया गया था, इसलिए आप जवाब दे सकते हैं कि सही नहीं हो सकता है। – IAdapter

+2

-1 क्योंकि प्रश्न जावा –

+0

जावा भाषा या जावा वर्चुअल मशीन के बारे में स्पष्ट था? दोनों के बीच एक बड़ा अंतर है। – OOPMan

1

BCEL से:

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

+0

मुझे वास्तव में जेरेमी नहीं मिला। क्या आप वर्तमान संदर्भ में बात कर रहे हैं? –

+1

बीसीईएल काम का एक हिस्सा करता है: यह आपको नई कक्षाओं को उत्पन्न करने या कुशल बनाने में मदद करता है। दूसरी बात यह है कि जावा में अंतर्निहित नई कक्षाओं को लोड करना है: प्रतिबिंब-एपीआई। – Mnementh

1

मैं इस उद्देश्य के लिए इन विकल्पों में देखें:

  • जावा स्रोत कोड जनरेट करें और बाहरी javac या आंतरिक संकलक उपकरण (नाम याद नहीं है) के साथ यह संकलन। और जैसा कि आप नामकरण के लिए ज़िम्मेदार हैं, क्लास लोडिंग विसंगतियों से बचने के लिए कक्षा के नाम में संस्करण गणना शामिल करें। मैं एक बार एक जावा 1.4 प्रोग्राम है जो एक मौजूदा विरासत डेटाबेस से व्यापार के नियम ले लिया बनाई, उत्पन्न जावा:
  • JavaScript इंजन समर्थन
  • कुछ परिदृश्य जावा proxys

संपादित का उपयोग कर हल किया जा सकता में बनाया का उपयोग करें फाइलें (मूल रूप से एक अनुमानित इंटरफ़ेस का कार्यान्वयन) उनमें से println() के समूह के साथ और उन्हें संकलित करने के लिए कमांड लाइन javac का उपयोग किया।

1

आप (जावा) कोड है कि bcel की तरह एक पुस्तकालय का उपयोग कर रनटाइम पर नए वर्गों (बाइट कोड) उत्पन्न करता है लिख सकते हैं। यह स्व-संशोधित कोड के समान नहीं है। मुझे संदेह है कि स्व-संशोधित कोड JVM का समर्थन नहीं करता है।

रनटाइम पर नए कोड जनरेट करने का एक उदाहरण के लिए, clojure के स्रोत कोड पर एक नजर है।

0

एक छात्र मैं JikesRVM पर काम मिल गया है। यह जावा में एक जेवीएम लागू (ज्यादातर) है। रनटाइम पर यह जेआईटी खुद संकलित होगा! यह तकनीक का एक बहुत अच्छा टुकड़ा है।

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

  • कोई संबंधित समस्या नहीं^_^