aspectj 4 捕獲方法上的連接點(diǎn)

說明

本節(jié)結(jié)合《aspectj cookbook》第4章進(jìn)行學(xué)習(xí),利用官網(wǎng)以及demo學(xué)習(xí)

連接點(diǎn)有多種凌外,列舉如下
http://www.eclipse.org/aspectj/doc/released/progguide/quick.html#quick-pointcuts
這里以方法為切點(diǎn)

捕獲方法的調(diào)用

形式:call(MethodPattern)
定義:When a method is called, not including super calls of non-static methods.
作用:在方法調(diào)用時觸發(fā)涕侈,環(huán)境是調(diào)用類

MethodPattern定義見后面?zhèn)渥⑿菜铮纠缦?/p>

MethodPattern示例

demo

MyClass.java
package aspectj;

public class MyClass {
    public void foo() {
        System.out.println("foo");
    }
    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        myClass.foo();
    }
}

HelloWorld.aj
package aspectj;

public aspect HelloWorld {
    pointcut callPointcut():call(void aspectj.MyClass.foo());

    before(): callPointcut()
    {
//        System.out.println("Entering: " + thisJoinPoint.getSourceLocation());
        System.out.println("hello");
    }
}

結(jié)果
hello
foo

說明:call調(diào)用依賴于方法目標(biāo)的動靜態(tài)類型陪拘,這里不展開

捕獲方法調(diào)用上傳遞的參數(shù)值

結(jié)合args完成綁定

形式:args(Type or Id, ...)
定義: Picks out each join point where the arguments are instances of the appropriate type (or type of the identifier if using that form). A null argument is matched iff the static type of the argument (declared parameter type or field type) is the same as, or a subtype of, the specified args type.
作用: 從join point獲取參數(shù)渴庆,提供給pointcut

demo

package aspectj;

public aspect HelloWorld {
    //pointcut定義參數(shù)類型以及名字,args定義參數(shù)名,和pointcut參數(shù)名匹配
    pointcut callPointcut(int x):call(void aspectj.MyClass.foo(int)) && args(x);

    //advice需要定義參數(shù)類型以及參數(shù)名,和后面的pointcut的參數(shù)名匹配
    before(int y): callPointcut(y)
    {
        System.out.println("hello " + y);
    }
}

package aspectj;

public class MyClass {
    public void foo(int x) {
        System.out.println("foo " + x);
    }
    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        myClass.foo(3);
    }
}

結(jié)果
hello 3
foo 3

捕獲方法調(diào)用的目標(biāo)

也就是說捕獲是哪個對象(實(shí)例雅镊,instance)調(diào)用了作為join point的方法
結(jié)合tartge完成綁定

形式:target(Type or Id, ...)
定義: Picks out each join point where the target object (the object on which a call or field operation is applied to) is an instance of Type, or of the type of the identifier Id (which must be bound in the enclosing advice or pointcut definition). Will not match any calls, gets, or sets of static members.
作用: 從join point獲取調(diào)用的目標(biāo)對象襟雷,提供給pointcut進(jìn)行綁定

demo

package aspectj;

public class MyClass {
    public void foo(int x) {
        System.out.println("foo " + x);
    }
    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        System.out.println(myClass);
        myClass.foo(3);
    }
}

package aspectj;

public aspect HelloWorld {
    //pointcut定義參數(shù)類型以及名字,args定義參數(shù)名,和pointcut參數(shù)名匹配
    pointcut callPointcut(int x, MyClass y):call(void aspectj.MyClass.foo(int)) && args(x) && target(y);

    //advice需要定義參數(shù)類型以及參數(shù)名,和后面的pointcut的參數(shù)名匹配
    before(int x, MyClass y): callPointcut(x,y)
    {
        System.out.println("hello " + x + " " + y);
    }
}

結(jié)果
aspectj.MyClass@85ede7b
hello 3 aspectj.MyClass@85ede7b
foo 3

執(zhí)行一個方法時捕獲它

形式 execution(MethodPattern)
定義: Picks out each method execution join point whose signature matches MethodPattern.
作用:在方法執(zhí)行時觸發(fā)
備注:觸發(fā)的環(huán)境是在目標(biāo)類方法中(call的環(huán)境是調(diào)用類)

和call的區(qū)別就是仁烹,call是調(diào)用耸弄,是在方法外面(調(diào)用前后),execution是執(zhí)行,在方法里面(執(zhí)行前后)

execution切入點(diǎn)

demo

package aspectj;

public aspect HelloWorld {
    //pointcut定義參數(shù)類型以及名字,args定義參數(shù)名卓缰,和pointcut參數(shù)名匹配
    pointcut callPointcut(int x, MyClass y):call(void aspectj.MyClass.foo(int)) && args(x) && target(y);

    //advice需要定義參數(shù)類型以及參數(shù)名,和后面的pointcut的參數(shù)名匹配
    before(int x, MyClass y): callPointcut(x,y)
    {
        System.out.println("before call ");
        System.out.println(thisJoinPoint.getSourceLocation());
    }

    pointcut exePointcut(int x, MyClass y):execution(void aspectj.MyClass.foo(int)) && args(x) && target(y);

    before(int x, MyClass y): exePointcut(x,y)
    {
        System.out.println("before execution ");
        System.out.println(thisJoinPoint.getSourceLocation());
    }
}

輸出
aspectj.MyClass@723279cf
before call 
MyClass.java:10
before execution 
MyClass.java:4
foo 3

在執(zhí)行方法時捕獲this引用的值

形式:this(Type or Id)
定義:Picks out each join point where the currently executing object (the object bound to this) is an instance of Type, or of the type of the identifier Id (which must be bound in the enclosing advice or pointcut definition). Will not match any join points from static contexts.
作用:執(zhí)行期間(僅限execution),獲取this引用指向的對象

demo

package aspectj;

public aspect HelloWorld {


    pointcut exePointcut(int x, MyClass y):execution(void aspectj.MyClass.foo(int)) && args(x) && this(y);

    before(int x, MyClass y): exePointcut(x,y)
    {
        System.out.println("before execution " + y);
        System.out.println(thisJoinPoint.getSourceLocation());
    }
}

輸出
aspectj.MyClass@723279cf
before execution aspectj.MyClass@723279cf
MyClass.java:4
foo 3

備注

Pattern形式的定義

https://eclipse.org/aspectj/doc/released/progguide/semantics-pointcuts.html

MethodPattern = 
  [ModifiersPattern] TypePattern 
        [TypePattern . ] IdPattern (TypePattern | ".." , ... ) 
        [ throws ThrowsPattern ]

ConstructorPattern = 
  [ModifiersPattern ] 
        [TypePattern . ] new (TypePattern | ".." , ...) 
        [ throws ThrowsPattern ]

FieldPattern = 
  [ModifiersPattern] TypePattern [TypePattern . ] IdPattern

ThrowsPattern = 
  [ ! ] TypePattern , ...

TypePattern = 
    IdPattern [ + ] [ [] ... ]
    | ! TypePattern
    | TypePattern && TypePattern
    | TypePattern || TypePattern
    | ( TypePattern )  

IdPattern =
  Sequence of characters, possibly with special * and .. wildcards

ModifiersPattern =
  [ ! ] JavaModifier  ...

不同signature需要的參數(shù)

https://eclipse.org/aspectj/doc/released/adk15notebook/join-point-signatures.html

join point signature

環(huán)境說明

https://eclipse.org/aspectj/doc/released/progguide/semantics-joinPoints.html

image.png

問題

this和target環(huán)境的區(qū)分的意義

refer

語法說明 https://eclipse.org/aspectj/doc/released/progguide/semantics.html
《aspectj cookbook》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末计呈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子征唬,更是在濱河造成了極大的恐慌捌显,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,332評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件总寒,死亡現(xiàn)場離奇詭異扶歪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)摄闸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評論 3 385
  • 文/潘曉璐 我一進(jìn)店門善镰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人年枕,你說我怎么就攤上這事炫欺。” “怎么了熏兄?”我有些...
    開封第一講書人閱讀 157,812評論 0 348
  • 文/不壞的土叔 我叫張陵品洛,是天一觀的道長树姨。 經(jīng)常有香客問我,道長毫别,這世上最難降的妖魔是什么娃弓? 我笑而不...
    開封第一講書人閱讀 56,607評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮岛宦,結(jié)果婚禮上台丛,老公的妹妹穿的比我還像新娘。我一直安慰自己砾肺,他們只是感情好挽霉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,728評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著变汪,像睡著了一般侠坎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上裙盾,一...
    開封第一講書人閱讀 49,919評論 1 290
  • 那天实胸,我揣著相機(jī)與錄音,去河邊找鬼番官。 笑死庐完,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的徘熔。 我是一名探鬼主播门躯,決...
    沈念sama閱讀 39,071評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼酷师!你這毒婦竟也來了讶凉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,802評論 0 268
  • 序言:老撾萬榮一對情侶失蹤山孔,失蹤者是張志新(化名)和其女友劉穎懂讯,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體台颠,經(jīng)...
    沈念sama閱讀 44,256評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡域醇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,576評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蓉媳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片譬挚。...
    茶點(diǎn)故事閱讀 38,712評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖酪呻,靈堂內(nèi)的尸體忽然破棺而出减宣,到底是詐尸還是另有隱情,我是刑警寧澤玩荠,帶...
    沈念sama閱讀 34,389評論 4 332
  • 正文 年R本政府宣布漆腌,位于F島的核電站贼邓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏闷尿。R本人自食惡果不足惜塑径,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,032評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望填具。 院中可真熱鬧统舀,春花似錦、人聲如沸劳景。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盟广。三九已至闷串,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間筋量,已是汗流浹背烹吵。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桨武,地道東北人肋拔。 一個月前我還...
    沈念sama閱讀 46,473評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像玻募,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子一姿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,606評論 2 350

推薦閱讀更多精彩內(nèi)容