• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            qiezi的學習園地

            AS/C/C++/D/Java/JS/Python/Ruby

              C++博客 :: 首頁 :: 新隨筆 ::  ::  :: 管理 ::
            AOP是近年炒得很熱,但卻用得很少的一門技術(shù),不過這并不能阻止我去學習它。既然能一度炒得火熱,必定有過人之處。說AOP是一種思想或許更適合一些,它并不描述哪一種專有的技術(shù),也不指定實現(xiàn)方式。

            眾所周知,C++沒有豐富的動態(tài)類型信息,更沒有動態(tài)生成類的功能(C++類型在編譯后就基本上沒有類型存在了),所以無法像java一樣采用動態(tài)代理來實現(xiàn)AOP。

            Aspect C++是C++的一個AOP實現(xiàn),它使用了插入代碼的方法。

            一個典型的Aspect C++示例需要一個C++源文件(.cpp)、一個Aspect C++源文件(.ah),通過ac++編譯器把C++源文件和Aspect C++源文件轉(zhuǎn)換成混合的C++源文件(如果有頭文件也會轉(zhuǎn)換),最后通過普通的C++編譯器編譯出可執(zhí)行文件。

            下面是一個簡單的示例:

            1、C++源文件:
            #include <stdio.h>

            class A {
            public:
              
            int a(int i, float b);
            };

            int A::a(int i, float b) {
              printf(
            "inside A::a(%d, %f)\n", i, b);
              
            return i;
            }

            void b(char c, char *str) {
              printf(
            "inside b(%c, %s)\n", c, str);
            }

            int main() {
              A a;
              a.a(
            47113.14);
              b(
            'H'"ello World");
              return 0;
            }

            2、Aspect C++源文件:
            #include <stdio.h>

            aspect Action {
              advice execution(
            "% A::%()"|| execution("% b()") : around()  {
                printf(
            "A: before(exec) %s\n", JoinPoint::signature());
                printf(
            "that  : %p\n" , tjp->that());
                printf(
            "target: %p\n" ,tjp->target());
                tjp
            ->proceed();
                printf(
            "A: after(exec) %s\n", JoinPoint::signature());
              }
              advice call(
            "% A::%()"|| call("% b()") : around()  {
                printf(
            "A: before(call) %s\n", JoinPoint::signature());
                printf(
            "that  : %p\n" , tjp->that());
                printf(
            "target: %p\n" ,tjp->target());
                tjp
            ->proceed();
                printf(
            "A: after(call) %s\n", JoinPoint::signature());
              }
            };

            aspect ActionB {
              advice execution(
            "% A::%()"|| execution("% b()") : around()  {
                printf(
            "B: before(exec) %s\n", JoinPoint::signature());
                printf(
            "that  : %p\n" , tjp->that());
                printf(
            "target: %p\n" ,tjp->target());
                tjp
            ->proceed();
                printf(
            "B: after(exec) %s\n", JoinPoint::signature());
              }
              advice call(
            "% A::%()"|| call("% b()") : around()  {
                printf(
            "B: before(call) %s\n", JoinPoint::signature());
                printf(
            "that  : %p\n" , tjp->that());
                printf(
            "target: %p\n" ,tjp->target());
                tjp
            ->proceed();
                printf(
            "B: after(call) %s\n", JoinPoint::signature());
              }
            };

            簡單說明一下:
            1、“aspect Action”定義了一個“方面”,名字是“Action”,定義一個方面可以理解為“我關(guān)注程序的這個方面”。
            2、“advice 切入點:位置”定義一個“處理方法”,在切入點的指定位置上執(zhí)行代碼。切入點可以選擇call、execution、construction、destruction,分別表示調(diào)用、執(zhí)行、構(gòu)造函數(shù)、析構(gòu)函數(shù)。執(zhí)行點可以選擇before、after、around,分別表示在這些切入點的前面、后面或替換掉整個函數(shù)。
            3、tpj表示thisJoinPoint,表示切入點本身。上面的例子由于使用around替換了整個執(zhí)行過程,所以要執(zhí)行原來的操作還需要調(diào)用tpj->proceed()。這里的around完成的功能可由一個before和一個after代替
            4、切入點的匹配模式。切入點通過字符串來匹配要切入的操作,“%”字符表示匹配任意類型(或名字),在AspectJ中,這個字符是“*”,由于C++中“*”用來定義指針,所以在Aspect C++中用“%”;“...”用來匹配任意個參數(shù)。

            編譯:
            首先運行ac++ -p <你的源文件所在目錄> -d <輸出文件目錄> -I<附加頭文件目錄>,這一步會轉(zhuǎn)換C++源文件和Aspect C++源文件。

            如果在安裝了VC,編譯時可指定INCLUDE路徑及_WIN32宏。
            ac++ -p <你的源文件所在目錄> -d <輸出文件目錄> -I<附加頭文件目錄> -I"C:\Program Files\Microsoft Visual Studio 8\VC\include" -D_WIN32

            然后直接編譯:
            cl <源文件名>.cc

            上面這個程序在處理前運行結(jié)果如下:
            F:\soft\ac\examples\Action>main
            inside A::a(
            47113.140000)
            inside b(H, ello World)

            經(jīng)Aspect C++處理后運行結(jié)果:
            F:\soft\ac\examples\Action-out>main
            A: before(call) 
            int A::a(int,float)
            that  : 
            00000000
            target: 0012FF73
            B: before(call) 
            int A::a(int,float)
            that  : 
            00000000
            target: 0012FF73
            A: before(exec) 
            int A::a(int,float)
            that  : 0012FF73
            target: 0012FF73
            B: before(exec) 
            int A::a(int,float)
            that  : 0012FF73
            target: 0012FF73
            inside A::a(
            47113.140000)
            B: after(exec) 
            int A::a(int,float)
            A: after(exec) 
            int A::a(int,float)
            B: after(call) 
            int A::a(int,float)
            A: after(call) 
            int A::a(int,float)
            A: before(call) 
            void b(char,char *)
            that  : 
            00000000
            target: 
            00000000
            B: before(call) 
            void b(char,char *)
            that  : 
            00000000
            target: 
            00000000
            A: before(exec) 
            void b(char,char *)
            that  : 
            00000000
            target: 
            00000000
            B: before(exec) 
            void b(char,char *)
            that  : 
            00000000
            target: 
            00000000
            inside b(H, ello World)
            B: after(exec) 
            void b(char,char *)
            A: after(exec) 
            void b(char,char *)
            B: after(call) 
            void b(char,char *)
            A: after(call) 
            void b(char,char *)

            posted on 2005-12-15 15:43 qiezi 閱讀(2949) 評論(7)  編輯 收藏 引用 所屬分類: C++
            99久久国产精品免费一区二区| 亚洲欧美伊人久久综合一区二区| 91久久九九无码成人网站| 国内精品伊人久久久久网站| 亚洲国产香蕉人人爽成AV片久久 | 51久久夜色精品国产| 久久精品一区二区影院| 亚洲va中文字幕无码久久| 色偷偷888欧美精品久久久| 青青热久久国产久精品 | 久久国产精品一区| 色88久久久久高潮综合影院| 国产亚州精品女人久久久久久 | 久久久久亚洲AV成人网人人网站| MM131亚洲国产美女久久| 亚洲а∨天堂久久精品| 人人狠狠综合久久亚洲婷婷| 久久精品国产色蜜蜜麻豆| 久久久久国产亚洲AV麻豆| 国内精品久久久久伊人av| 久久免费看黄a级毛片| 国产精品熟女福利久久AV| 韩国免费A级毛片久久| 国产精品99久久久精品无码| 久久免费国产精品一区二区| 久久亚洲精品中文字幕| 欧美亚洲国产精品久久| 久久久91人妻无码精品蜜桃HD| 91精品国产高清久久久久久io | 无码人妻少妇久久中文字幕| 91秦先生久久久久久久| 嫩草影院久久99| 91麻精品国产91久久久久| …久久精品99久久香蕉国产| 久久偷看各类wc女厕嘘嘘| 亚洲午夜无码久久久久| 精品国产乱码久久久久久呢| 东方aⅴ免费观看久久av | 美女久久久久久| 免费精品久久久久久中文字幕| 久久久久女教师免费一区|