2.3 建議代碼

2.3 建議代碼

被稱作建的議代碼可以捆綁到代碼結合點。建議代碼可以被理解成當程序中相應的代碼結合點到達的時候激活的動作。AspectC++語言中用來指定建議代碼的元素是建議聲明。通過在定義了哪里、什么情況下激活代碼應該被激活的點切表達式后引入關鍵詞advice來聲明。

例:建議聲明

advice execution("void login(...)") : before() {
    count << "Logging in." << endl;
}

點切表達式后跟著的代碼片段:before()決定了建議代碼應該直接在代碼結合點到達之前激活。這里也可以用:after()來表示在代碼結合點到達之后,此外,:around()表示建議代碼應該代碼代碼結合點描述的代碼來執行。在包圍建議中,建議代碼可以顯式地在結合點處觸發程序代碼的執行,這樣建議代碼可以在結合點之前之后執行。建議代碼并沒有特別的在結合點無視程序代碼的訪問能力。

在純粹的結合點點切描述符旁,我們也可以為將變量綁定到結合點的上下文信息中。因此,如同函數調用的真正參數值可以在建議代碼中得以訪問。

例:可訪問上下文信息的建議聲明

pointcut new_user(const char *name) = execution("void login(...)") && args(name);

advice new_user(name) : before(const char *name) {
    cout << "User " << name << " is logging in." << endl;
}

上面的例子首先定義了一個綁定了上下文變量name的點切new_user。這意味著每當點切new_user描述的結合點到達時,都提供了一個const char*類型的值。在點切表達式中使用的點切函數args會到達在程序中所有使用了const char*類型參數的地方。因此args(name)在執行時綁定了namelogin函數第一也是唯一一個參數上。

例子中的跟隨在點切聲明后的建議聲明將建議代碼的執行綁定到new_user描述的結合點到達的事件上。上下文變量持有到達的結合點的參數的真實值,它應該被聲明成beforeafter或者around的一個正式參數。這個參數可以在建議代碼中像一個普通函數參數那樣來使用。

在點切函數args旁,綁定的上下文參數可以由thattargetresult來體現 。同時,這些點切函數表現的如同相應上下文變量的過濾器一樣。就像這個例子中的args,在過濾器上所有的結合點都有一個const char*類型的參數。

2.3.1 引入

AspectC++支持的第二種類型的建議是引入。引入被特意用來擴展程序代碼和數據結構。下面的例子給兩個類分別擴展了一個屬性和一個方法。

例:引入

pointcut shapes() = "Circle" || "Polygon";

advice shapes() : slice class {
    bool m_shaded;
    void shaded(bool state) {
        m_shaded = state;
    }
};

就像正常的建議聲明一樣,引入用關鍵詞advice引入。如果接下來的點切是名稱點切,點切描述的類和方法將引入切片聲明跟隨在詞素“:”后。引入代碼隨后可以像其他函數、屬性等一樣用于正常的程序代碼中。引入中的建議代碼將無視結合點的程序代碼,擁有完整的訪問權限。例如,一個類中的方法引用甚至能夠訪問那個類的私有成員。

切片也可以用來引入新的基類。接下來的例子確保所有以“Object”為結尾的類都派生自類MemoryPool。這個類可能通過覆寫newdelete操作符來實現自己的內存管理。繼承自MemoryPool的類必須重新定義純虛方法release,它是內存管理的部分實現。這在點切中的第二行實現。

例:基類引入

advice "%Object" : slice class : public MemoryPool {
    virtual void release() = 0;
}

2.3.2 建議順序

如果在同一個結合點被多個建議影響,那么就可能有必要定義建議的執行順序,因為建議代碼之間可能存在依賴關系(“方向交集”)。接下來的例子將展示如何在AspectC++中定義建議代碼的優先級。

例:建議順序

advice execution("void send(...") : order("Encrypt", "Log");

如果當函數send(...)執行時,EncryptlLog方向的建議都要運行,以上的順序聲明將定義Encrypt建議有更高的優先級。第8節將詳細描述更具體的建議順序和優先級。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,692評論 25 708
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,809評論 18 139
  • 前言 人生苦多,快來 Kotlin ,快速學習Kotlin! 什么是Kotlin? Kotlin 是種靜態類型編程...
    任半生囂狂閱讀 26,249評論 9 118
  • 題語:心在想,眼在看。 不是我不尊重生命 我實在不愿白白地浪費時間 我已人到中年 對白晝和黑夜都很留戀 它們 一個...
    詩人丑乙閱讀 137評論 0 1
  • 最近這幾年是創業的高峰期,我們時常從各種媒體輿論處看到某某公司起來了,也會時不時的得知某某公司倒下了,這似乎已經成...
    澤霈君閱讀 1,280評論 2 2