2011-04-02 12 views
5

में एक विधि में एक व्यावसायिक विधि के स्थानीय चर का उपयोग करें, मैं एक वर्ग वर्ग में एक विधि में, एक व्यापार वर्ग में एक विधि से स्थानीय चर का उपयोग करना चाहता हूं। उदाहरण के लिएएएसपीईसीटी

class BusinessClass { 
    public void simpleTest() { 
     ... 
     String localString = new String("test"); 
     ... 
    } 
} 

MyAspect { 
    log() { 
     // I WANT TO ACCESS THE VALUE OF LOCALSTRING HERE 
    } 
} 

मैं MyAspect के लॉग विधि में स्थानीय स्ट्रिंग के मान को एक्सेस करना चाहता हूं। वसंत/AspectJ का उपयोग करके इसे पूरा करने का कोई तरीका है, तो कृपया मुझे बताएं। साथ ही, सरलतम विधि हस्ताक्षर को बदले बिना पूरा करने का कोई तरीका है?

अग्रिम धन्यवाद!

उत्तर

5

जैसा कि मैं उन्हें समझता हूं, पहलुओं को कई तरीकों (जैसे पॉइंटकट द्वारा परिभाषित) पर लागू होना है। इस प्रकार, वे विधि के आंतरिक भाग नहीं देखते हैं: केवल विधि के तर्क और इसके परिणाम। इसका मतलब है कि आप जो चाहते हैं वह सीधे नहीं किया जा सकता है, लेकिन आप अपनी विधि को दो टुकड़ों में दोबारा करने का प्रयास कर सकते हैं, जो localString को तर्क के रूप में लेता है, और दूसरा जो इसके लिए डिफ़ॉल्ट मान लागू करता है। इसके बाद आपको संलग्न करने के लिए एक अच्छा सुविधाजनक संयुक्त बिंदु मिलेगा। (AspectJ reference lists join points, और स्थानीय चर के संदर्भ उनमें से एक नहीं हैं।) यदि आप "आंतरिक" विधि को निजी या पैकेज-निजी बनाते हैं, तो आप विधि के आम तौर पर समझने वाले हस्ताक्षर को भी नहीं बदलेंगे (क्योंकि बाहरी कोड जीता है पेश की गई विधि पर निर्भर नहीं हो सकता है)।

+0

यह भी ध्यान रखें कि वसंत एओपी केवल AspectJ के उप-समूह का समर्थन करता है। –

15

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

हालांकि, अगर आप अपने कोड को दोबारा प्रतिक्रिया देना चाहते थे ताकि स्थानीय चर को विधि के अंदर बनाया गया हो, तो आप इसे एक्सेस कर सकते हैं।

संकल्पनात्मक रूप से, इस प्रकार का रिफैक्टरिंग आपके लिए कोड बेहतर हो सकता है। बस एक नया स्थानीय चर आवंटित करने के बजाय, आप स्पष्ट रूप से एक अच्छी तरह से नामित विधि में encapsulating द्वारा आवंटन क्या कर रहा है के बारे में स्पष्ट हो सकता है।

उदाहरण के लिए

, इस:

private String allocateTestString() { 
    return new String("test") 
} 

तो फिर तुम स्थानीय चर इस तरह से कब्जा करने के लिए एक pointcut लिख सकते हैं:

String localString = allocateTestString(); // or some better name 
इस पद्धति से

:

String localString = new String("test"); 

इस हो जाता है :

after() returning(String var) : call(private String allocateTestString()) { 
    // do something fun 
} 
+0

हालांकि आपका उत्तर भी सही है, उसने डोनाल को वोट दिया क्योंकि उसने पहले जवाब दिया था। आपके इनपुट के लिए फिर से धन्यवाद। – San

+0

क्या पॉइंटकट पर इंस्टेंस चर को स्थानांतरित करना संभव है? – Irakli