<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    最愛Java

    書山有路勤為徑,學海無涯苦作舟

    《AspectJ Cookbook》讀書筆記七: 捕獲類和對象構造上的連接點

    一.  捕獲對構造函數的調用
        使用Call(Signature)寫入點,它帶有額外的new關鍵字作為簽名的一部分。使用與構造函數有關的call(Signature)切入點的語法如下:
        pointcut <pointcut name>(<any values to be picked up>): call(<optional modifier> <class>.new(<parameter types>));

        在用于捕獲對構造函數的調用時,call(Signature)切入點具有3個關鍵特征:
        1.在把一個類實例化成一個對象時,具有new關鍵字的call(Signature)切入點會捕獲連接點。
        2.通過使用around()形式的通知,call(Signature)寫入點可以在Java的正常繼承規(guī)則的限制下重寫返回對象的類型。
        3.編譯器不會檢查指定的Signature是否對應于實際的構造函數。

     

    package com.aspectj;

    public aspect CallNewRecipe {
        
    /*
         * Specifies calling advice when any constructor is called
         * that meets the following signature rules:
         * 
         * Class Name:MyClass
         * Method Name:new (This is a keyword indicating the constructor call)
         * Method Parameters: int , String
         
    */

        pointcut myClassConstructorWithIntAndStringPointcut() : call(MyClass.
    new(int , String));
        
        
    //Advice declaration
        before() : myClassConstructorWithIntAndStringPointcut() {
            System.out.println(
    "---------- Aspect Advice Logic ----------");
            System.out.println(
    "In the advice picked by myClassConstructorWithIntAndOthersPointcut()");
            System.out.println(
    "The current type of object under construction is:");
            System.out.println(thisJoinPoint.getThis());
            System.out.println(
    "Signature: " + thisJoinPoint.getSignature());
            System.out.println(
    "Source Line: " + thisJoinPoint.getSourceLocation());
            System.out.println(
    "-----------------------------------------");
        }

    }



    二. 在執(zhí)行構造函數時捕獲它
        使用execution(Signature)切入點,它帶有額外的new關鍵字作為簽名的一部分。使用與構造函數有關的execution(Signature)切入點的語法如下:
        pointcut <pointcut name>(<any values to be picked up>):execution(<optional modifier> <class>.new<parameter types>));

        在用于捕獲構造函數的執(zhí)行時,execution(Signature)切入點具有3個關鍵特征:
        1.在執(zhí)行類的構造函數時,具有new關鍵字的execution(Signature)切入點會觸發(fā)連接點。
        2.不能在調用類的構造函數之前那一刻觸發(fā)連接點。這會阻止重寫返回的對象。
        3.可以使用around()通知來重寫構造函數方法的實現(xiàn),當不能重寫正在構造的對象的類型。


    package com.aspectj;

    public aspect ExecutionNewRecipe {
        
    /*
         * Specifies calling advice when any constructor executes
         * that meets the following signature rules:
         * 
         * Class Name:MyClass
         * Method Name:new (This is a keyword indicating the constructor call)
         * Method Parameters: int , String
         
    */

        pointcut myClassConstructorWithIntAndStringPointcut() : execution(MyClass.
    new(int,String));
        
        
    //Advice declaration
        before() : myClassConstructorWithIntAndStringPointcut() {
            System.out.println(
    "---------- Aspect Advice Logic ----------");
            System.out.println(
    "In the advice picked by myClassConstructorWithIntAndOthersPointcut()");
            System.out.println(
    "The current type of object under construction is:");
            System.out.println(thisJoinPoint.getThis().getClass());
            System.out.println(
    "Signature: " + thisJoinPoint.getSignature());
            System.out.println(
    "Source Line: " + thisJoinPoint.getSourceLocation());
            System.out.println(
    "-----------------------------------------");        
        }

    }


    三. 捕獲何時初始化對象
        使用initialization(Signature)切入點。initialization(Signature)切入點的語法如下:
        pointcut <pointcut name>(<any values to be picked up>):initialization(<optional modifier> <class>.new<parameter types>));

        initialization(Signature)切入點具有5個關鍵特征:
        1.initialization(Signature)切入點必須包含new關鍵字。
        2.initialization(Signature)切入點捕獲連接點發(fā)生在任何超類的初始化之后,以及從構造函數方法返回之前。
        3.Signature必須解析成特定類的構造函數,而不是一個簡單的方法。
        4.initialization(Signature)切入點提供了編譯時的檢查,用于檢查構造函數是否正在被引用。
        5.由于AspectJ編譯器中的編譯器限制,當與around()通知關聯(lián)時,不能使用initialization(Signature)切入點。

     

    package com.aspectj;


    public aspect InitializationRecipe {
        
    /*
         * Specifies calling advice when any object
         * initializes using a constructor
         * that meets the following signature rules:
         * 
         * Class Name:MyClass
         * Method Name:new (This is a keyword indicating the constructor call)
         * Method Parameters: int and any others
         
    */

        pointcut myClassObjectInitializationWithIntAndStringPointcut() : execution(MyClass.
    new(int,*));
        
        
    //Advice declaration
        before() : myClassObjectInitializationWithIntAndStringPointcut() {
            System.out.println(
    "---------- Aspect Advice Logic ----------");
            System.out.println(
    "In the advice picked by myClassObjectInitializationWithIntAndStringPointcut()");
            System.out.println(
    "The current type of object under construction is:");
            System.out.println(thisJoinPoint.getThis().getClass());
            System.out.println(
    "Signature: " + thisJoinPoint.getSignature());
            System.out.println(
    "Source Line: " + thisJoinPoint.getSourceLocation());
            System.out.println(
    "-----------------------------------------");        
        }

    }



    四. 捕獲何時將要初始化一個對象
        使用preinitialization(Signature)切入點。preinitialization(Signature)切入點的語法如下:
        pointcut <pointcut name>(<any values to be picked up>):preinitialization(<optional modifier> <class>.new<parameter types>));

        preinitialization(Signature)切入點具有5個關鍵特征:
        1.preinitialization(Signature)切入點必須包含new關鍵字。
        2.preinitialization(Signature)切入點捕獲連接點發(fā)生在進入捕獲構造函數之后,以及調用任何超類構造函數之前。
        3.Signature必須解析成一個構造函數。
        4.preinitialization(Signature)切入點提供了編譯時的檢查,用于檢查構造函數是否正在被引用。
        5.由于AspectJ編譯器中的編譯器限制,當與around()通知關聯(lián)時,不能使用preinitialization(Signature)切入點。

     

    package com.aspectj;

    public aspect PreInitializationRecipe {
        
    /*
         * Specifies calling advice just before an object initializes
         * using a constructor that meets the following signature rules:
         * 
         * Class Name:MyClass
         * Method Name:new (This is a keyword indicating the constructor call)
         * Method Parameters: an int followed by a String
         
    */

        pointcut myClassIntStringObjectPreInitializationPointcut() : preinitialization(MyClass.
    new(int,String));
        
        
    //Advice declaration
        before(int number , String name) : myClassIntStringObjectPreInitializationPointcut() && args(number , name) {
            System.out.println(
    "---------- Aspect Advice Logic ----------");
            System.out.println(
    "In the advice picked by anyMyClassObjectInitializationPointcut()");
            System.out.println(
    "The current type of object under construction is:");
            System.out.println(thisJoinPoint.getThis());
            System.out.println(
    "The values passed in where: " + number + " , " + name);
            System.out.println(
    "Signature: " + thisJoinPoint.getSignature());
            System.out.println(
    "Source Line: " + thisJoinPoint.getSourceLocation());
            System.out.println(
    "-----------------------------------------");        
        }

    }



    五. 捕獲何時初始化類
        使用staticinitialization(TypePattern)寫入點。staticinitialization(TypePattern)寫入點的語法如下:
        pointcut <pointcout name>(<any values to be picked up>) : staticinitialization(<class>);

        staticinitialization(TypePattern)切入點具有兩個關鍵特征:
        1.對可供staticinitialization(TypePattern)切入點所選通知使用的環(huán)境有一些限制。沒有父對象觸發(fā)靜態(tài)初始化;因此,沒有this引用。也不涉及實例對象,因此,沒有目標引用。
        2.TypePattern可以包含通配符,用于選擇一系列不同的類。

    package com.aspectj;

    public aspect StaticinitializationRecipe {
        
    /*
         * Specifies calling advice when a class is initialized
         * that meets the following type pattern rules:
         * 
         * Class Name:MyClass
         
    */

        pointcut myClassStaticInitializationPointcut() : staticinitialization(MyClass);
        
        
    //Advice declaration
        before() : myClassStaticInitializationPointcut() {
            System.out.println(
    "---------- Aspect Advice Logic ----------");
            System.out.println(
    "In the advice picked by myClassStaticInitializationPointcut()");
            System.out.println(
    "Join Point Kind: ");
            System.out.println(thisJoinPoint.getStaticPart().getKind());
            System.out.println(
    "Signature: " + thisJoinPoint.getSignature());
            System.out.println(
    "Source Line: " + thisJoinPoint.getSourceLocation());
            System.out.println(
    "-----------------------------------------");        
        }

    }

    posted on 2008-08-22 10:32 Brian 閱讀(1235) 評論(0)  編輯  收藏 所屬分類: 《AspectJ Cookbook》讀書筆記

    公告


    導航

    <2008年8月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    統(tǒng)計

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    收藏夾

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 精品国产无限资源免费观看| 国产免费阿v精品视频网址| 永久在线免费观看| 久久久久久亚洲精品| 免费人成在线观看视频高潮 | 狼友av永久网站免费观看| 亚洲伊人久久大香线焦| 无码人妻一区二区三区免费| 亚洲一级特黄特黄的大片| 久久精品网站免费观看| 亚洲Av永久无码精品一区二区| 国产成人免费福利网站| 一级一级一级毛片免费毛片| 亚洲精品A在线观看| 中文在线免费不卡视频| 亚洲AV无码成人精品区在线观看| 日韩精品在线免费观看| 亚洲国产超清无码专区| 在线免费视频一区二区| 免费国产a理论片| 亚洲国产成人片在线观看无码| 91香蕉在线观看免费高清| 亚洲一区精彩视频| 国产小视频在线免费| 国产成人精品免费大全| 久久国产亚洲高清观看| 毛片免费视频播放| 人人鲁免费播放视频人人香蕉| 国产亚洲综合网曝门系列| 亚洲黄色免费网站| 猫咪www免费人成网站| 亚洲va无码手机在线电影| 青苹果乐园免费高清在线| 青草久久精品亚洲综合专区| 亚洲日韩乱码中文无码蜜桃臀网站 | 国产免费女女脚奴视频网| 日韩在线视精品在亚洲| 亚洲av无码潮喷在线观看| 毛片免费观看的视频在线| 精品国产福利尤物免费| 亚洲一区二区三区精品视频|