मैं एएसएम उपयोग कर रहा हूँ और की तरह कुछ को फिर से लिखने के लिए चाहते हैं कहा जाता है इंजेक्शनएक जावा विधि _before_ एक और तरीका
someMethod().injectedMethod(arg).targetMethod(args...)
दिक्कत यह है कि मैं क्या पता नहीं है है पहले विधि है, मुझे केवल लक्ष्य विधि पता है (इसलिए someMethod()
ढूंढना और इसके बाद इंजेक्शन करना एक विकल्प नहीं है)।
मेरे पास लक्ष्य पद्धति के कई संस्करण भी हैं, पैरामीटर के विभिन्न सेट के साथ मैं इसे काम करना चाहता हूं।
एएसएम मैं कर सकते हैं आसानी से उपयोग करते हुए लक्ष्य विधि मंगलाचरण लगता है, लेकिन दुर्भाग्य से उस बिंदु पर संकार्य ढेर है:
[ argN, ..., arg1, instance, ... ]
और जब मैं कितनी दूर नीचे उदाहरण हो जाएगा काम कर सकते हैं, वहाँ कोई बाईटकोड मैं है इंजेक्ट कर सकते हैं कि इसे पढ़ा जाएगा। मुझे पता है कि आप इसे डुप्लिकेशंस के साथ चाल का उपयोग करके 4 पैरामीटर तक कर सकते हैं, लेकिन मुझे एक सामान्य समाधान की आवश्यकता है।
मैं स्थानीय चर का एक गुच्छा जोड़ सकता हूं और स्टैक से सबकुछ कॉपी कर सकता हूं, उदाहरण की ओर इशारा करता हूं और सबकुछ वापस रखता हूं, लेकिन यह एक रनटाइम अक्षमता है जिसे मैं वास्तव में नहीं चाहता हूं।
मुझे क्या लगता है कि यह काम करेगा यदि मैं ट्रैक कर सकता हूं कि कौन सा निर्देश स्टैक्स पर इंस्टेंस पॉइंटर डालने के लिए ज़िम्मेदार था, और फिर मैं लक्ष्य विधि आमंत्रण के बजाय वहां अपना विधि आमंत्रण इंजेक्ट कर सकता था। हालांकि मुझे ऐसा करने में मेरी मदद करने के लिए कुछ भी खोजने में कोई भाग्य नहीं है।
मुझे पता है कि AspectJ जैसी चीजें इसके लिए अनुमति देती हैं, लेकिन इसे लोड करने के रूप में बहुत से वर्गों के लिए ऐसा करना है और AspectJ बहुत धीमी है।
क्या कोई मुझे एएसएम के शीर्ष पर बने विश्लेषण टूल पर इंगित कर सकता है जो मुझे ऐसा करने दे सकता है या कोई भी किसी विधि से पहले एक विधि कॉल इंजेक्ट करने के लिए बेहतर दृष्टिकोण के बारे में सोच सकता है?
मुझे यह नहीं मिला, क्या आपको वास्तव में एएसएम का उपयोग करने की आवश्यकता है? क्योंकि ऐसा लगता है कि आप मौजूदा जार को हैक करने की कोशिश कर रहे हैं। इसके लिए इसे कम करना बेहतर होगा ......... यदि नहीं, और आप जावा एप्लिकेशन लिख रहे हैं, तो क्या आप इसके लिए एग्रीगेशन का उपयोग नहीं कर सकते? – fredcrs
मैं कक्षाओं को विघटित नहीं कर सकता क्योंकि मैं इसे क्लास लोड समय पर एक जावावांट के रूप में ही लगा सकता हूं। मैं न तो 'मौजूदा जार हैकिंग' या 'जावा एप्लिकेशन लिखना' हूं; मैं कक्षाओं में बाइटकोड इंजेक्शन कर रहा हूं क्योंकि वे लोड होते हैं। – David
मैंने स्कूल में रहते हुए [सूट] (http://www.sable.mcgill.ca/soot/) के साथ काम किया है और वास्तव में इस तरह की चीजें की हैं (ठीक है शायद थोड़ा कम जटिल)। जरा देखो तो। दुर्भाग्यवश, मुझे नहीं पता कि यह एएसएम के शीर्ष पर बनाया गया है या नहीं। दिमाग में आने वाला एकमात्र अन्य विकल्प AspectJ है। – arin