2011-03-05 12 views
27

मैं AspectJ संदर्भ here में जाना जाता है यह कहा गया है कि 'cflow'पहलू उन्मुख प्रोग्रामिंग - 'cflow' क्या है?

cflow(Pointcut) है - हर में बिंदु में शामिल होने के लिए प्रत्येक के नियंत्रण प्रवाह में शामिल होने के बिंदु पी Pointcut से बाहर उठाया, पी ही

सहित

यह मेरे लिए पूरी तरह से स्पष्ट नहीं है और मैं सोच रहा था कि क्या कोई सीएफएलओ के अर्थ पर थोड़ा और विस्तार कर सकता है? इसका इस्तेमाल क्यों करें?

वास्तव में धन्यवाद।

उत्तर

45

सीएफएलओ आपको पूरे नियंत्रण प्रवाह की सलाह देने में मदद करता है। एक उदाहरण की कोशिश करते हैं, मैं 4 छोटे वर्गों

है
public class A { 

    public static void methodA() { 
     B.methodB(); 
    } 

} 

public class B { 

    public static void methodB() { 
     C.methodC(); 
     int a = 1; 
     int b = 2; 
     System.out.println(a + b); 
    } 

} 

public class C { 

    public static void methodC() { 
     D.methodD(); 
    } 

} 

public class D { 

    public static void methodD() { 

    } 

} 

मेरी पहलू:

public aspect CFlow { 

    public pointcut flow() : cflow(call(* B.methodB())) && !within(CFlow); 

    before() : flow() { 
     System.out.println(thisJoinPoint); 
    } 

} 

और मेरे धावक (सिर्फ देखने के लिए कि क्या होता है):

public class Test { 

    public static void main(String[] args) { 
     A.methodA(); 
    } 

} 
मेरी pointcut आप कर सकते थे में

cflow(call(* B.methodB())) देखें, इसलिए मैं B.methodB कॉलिंग से पहलू नियंत्रण प्रवाह चाहता हूं, और जब आप टेस्ट क्लास चलाते हैं तो आप कंसोल पर देखते हैं:

call(void test.B.methodB()) 
staticinitialization(test.B.<clinit>) 
execution(void test.B.methodB()) 
call(void test.C.methodC()) 
staticinitialization(test.C.<clinit>) 
execution(void test.C.methodC()) 
call(void test.D.methodD()) 
staticinitialization(test.D.<clinit>) 
execution(void test.D.methodD()) 
get(PrintStream java.lang.System.out) 
call(void java.io.PrintStream.println(int)) 
3 

अंतिम स्ट्रिंग पहलू से संबंधित नहीं है, यह के अंदर System.out.println की वजह से है। सभी मुद्रित शो आप विधियों और 'घटनाओं' (निष्पादन, कॉलिंग, प्रारंभिकरण ...) के प्रवाह श्रृंखलाओं को नियंत्रित करते हैं। आप देखते हैं, मैंने Test कक्षा से शुरू किया, जिसे methodA कहा जाता है लेकिन वे 'स्टैक' में नहीं हैं, क्योंकि हम methodB नियंत्रण प्रवाह में रूचि रखते थे।

आपको लगता है कि ढेर प्राप्त करना चाहते हैं, लेकिन पहली पंक्ति के बिना (जो खुद बुला), तो आपको

public pointcut flow() : cflowbelow(call(* B.methodB())) && !within(CFlow); 

cflowbelow परिभाषित करने की कोशिश कर सकता है (एक और pointcut, जो नियंत्रण प्रवाह का मतलब निर्दिष्ट को छोड़कर है हमारे मामले बुला B.methodB में)।

पॉइंटकट में !within(_aspect_) जोड़ने के लिए सावधान रहें, अन्यथा आपको कुछ भी अच्छा नहीं मिलेगा लेकिन StackOverflowError। ऐसा इसलिए होता है क्योंकि संकलन समय पर सीएफएलओ को परिभाषित नहीं किया जा सकता है, और रनटाइम पहलू पर नियंत्रण प्रवाह भी होता है (इसलिए यह शाश्वत रिकर्सन की ओर जाता है ...)

अच्छी तरह से, कॉल स्टैक के समान नियंत्रण प्रवाह के बारे में सोचें, फिर आपको इसके उपयोग का एक अनुमान मिलेगा;)

+3

ग्रेट उत्तर। आपकी सहायता के लिए बहुत धन्यवाद! – Joeblackdev

+1

ने भी मेरी मदद की! अधिक प्रतिनिधि का हकदार है;) – Matthias

+0

बहुत स्पष्ट और महान !! – ParkCheolu