2013-04-12 4 views
17

मेरे पास कुछ विरासत कोड में एक स्थिर विधि है, जिसे एकाधिक ग्राहकों द्वारा बुलाया जाता है। मुझे स्पष्ट रूप से इसे ओवरराइड करने के लिए कोई विकल्प नहीं है, या निर्भरता इंजेक्शन के माध्यम से व्यवहार बदलना है। मुझे मौजूदा कक्षा को संशोधित करने की अनुमति नहीं है।प्रतिबिंब के माध्यम से विधि व्यवहार कैसे बदलें?

अब मैं क्या करना चाहता हूं प्रतिबिंब का उपयोग करके व्यवहार (उस विधि - एक ही हस्ताक्षर और वापसी प्रकार के साथ) बदलना है।

क्या यह संभव है? यदि नहीं, तो क्या कोई डिज़ाइन पैटर्न मुझे बचा सकता है?

धन्यवाद!

संपादित करें: मैं कुछ बदल सकता हूं कि मैं क्या बदल सकता/संशोधित कर सकता हूं। मैं किसी भी मौजूदा वर्ग/विधि को नहीं बदल सकता - लेकिन मैं परियोजना में और कक्षाएं जोड़ सकता हूं। मौजूदा वर्गों के साथ मैं सबसे अच्छा कर सकता हूं उन्हें एनोटेट करना है। यह सब मौजूदा कोड में कुछ भी तोड़ने से बचने के लिए किया जाता है - जिसका मतलब है कि एक बड़ी परियोजना के लिए परीक्षण का पूरा दौर।

संपादित 2: java.lang.Instrumentation एंड्रॉइड के लिए उपलब्ध नहीं है - या नहीं यह एक अच्छा फिट लगता है!

+0

प्रतिबिंब क्यों? –

+3

आपको इसे बदलने की अनुमति नहीं है, लेकिन आपको इसे प्रतिबिंब के माध्यम से संशोधित करने की अनुमति है? ऐसा लगता है कि रास्ता अधिक जोखिम भरा है। – Keppil

+0

मुझे लगता है कि यह एक रखरखाव दुःस्वप्न में खत्म होने जा रहा है। कोड इसे पढ़ने पर झूठ बोल रहा होगा। जाओ और उस वर्ग को बदलने की मंजूरी प्राप्त करें। – SpaceTrucker

उत्तर

18

वैसे भी एक अजीब आवश्यकता की तरह लगता है ...

, प्रतिबिंब, यह केवल, वर्तमान कोड तलाश कर सकते हैं तरीकों और constuctors, परिवर्तन क्षेत्रों मूल्यों, चीजों को उस तरह का आह्वान आप कोड व्यवहार बदलने के लिए अनुमति नहीं है।

यदि आप वास्तव में किसी विधि के व्यवहार को बदलना चाहते हैं तो आपको एएसएम जैसे बाइटकोड मैनिपुलेशन लाइब्रेरी का उपयोग करना होगा। लेकिन यह बहुत ही आसान है, शायद नहीं एक अच्छा विचार नहीं हो जाएगा ...

पैटर्न है कि आप मदद कर सकता है: कक्षा अंतिम नहीं है, तो

  • और आप, ग्राहकों को संशोधित मौजूदा वर्ग का विस्तार कर सकते हैं और अपने वांछित व्यवहार के साथ, विधि अधिभार। संपादित करें: यह केवल तभी काम करेगा जब विधि स्थैतिक नहीं थी!
  • पहलू प्रोग्रामिंग: वैसे भी AspectJ

का उपयोग कर विधि के लिए इंटरसेप्टर जोड़ने के लिए, ऐसा करने के लिए सबसे तार्किक बात सिर्फ अपने कोड और अधिक जटिल कर देगा मौजूदा वर्ग, काम arounds संशोधित करने के लिए एक रास्ता खोजने के लिए होगा और बनाए रखने के लिए कठिन है।

शुभकामनाएं।

+0

स्थैतिक होने की विधि को ओवरराइड नहीं किया जा सकता है। मैं सोच रहा हूं कि प्रतिबिंब फ़ील्ड मानों को बदल सकता है, क्यों विधियां नहीं! – SlowAndSteady

+0

मैं एओपी के लिए नया हूँ। अब इसका अन्वेषण करें! – SlowAndSteady

+0

आप निश्चित रूप से स्थिर होने की विधि के बारे में सही हैं। मैंने तदनुसार अपना जवाब संपादित किया। –

8

मुझे लगता है कि आप Instrumentation कक्षा देख सकते हैं जिसमें एक विधि redefineClasses(ClassDefintion classDefinition) है।

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

उम्मीद है कि इससे मदद मिलती है।

संदर्भ: Javadoc

+0

क्षमा करें, यह एंड्रॉइड जोड़ने के लिए भूल गया। मेरे पास इस वर्ग का लाभ उठाने के लिए नहीं है :( – SlowAndSteady

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

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