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

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

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

    AspectJ初探

    早晨收到IBM developerWorks的郵件,看看有啥值得關注的東東。看到篇關于AOP的介紹,就大致讀了一下,文章倒沒什么新意,就是介紹AOP在項目中的應用,如何簡化log機制等。

    我對AOP也有些了解,主要研究過Spring中AOP實現使用的Dynamic Proxy機制,對于pointcut和advice也有些概念。但也僅此而已,沒有實際寫過一行AOP的代碼,更不用說在項目中使用AOP了。點了點文章末尾的鏈接,進入了AOP的世界,看看AOP的幾種不同實現,以及對其的比較文章,倒引起了我對AspectJ的興趣。并非其它實現如AspectWerkz,JBoss4.0或Spring不如AspectJ,它們各有側重,但我對AspectJ的靜態檢查和較好的IDE集成性(有eclipse3.0的插件ajdt)比較好奇。于是網上down了個ajdt(下載url:http://www.eclipse.org/ajdt/),開始了對AspectJ的探索之旅。

    Ajdt的安裝和其它eclipse插件完全一樣,解壓,拷貝到相應目錄,重啟eclipse就OK了。進入eclipse,發現多了個按鈕,有AJ字樣,點擊就彈出創建AspectJ項目的窗口。先別著急,再查看window->preferences發現多了AspectJ和Visualiser欄目,隨便點點,也不用做什么更改,就能確認AJDT已經成功的集成進來了。

    新建個AspectJ項目,項目名就叫myaspect吧。在Package Explorer 中展開新項目,發現除了jre外它自己加入了一個AspectJ的lib,這就是AspectJ的類庫了,下面是一個叫build.ajproperties的文件,肯定是配置文件了,但具體配什么我也沒管太多,就希望馬上能寫段代碼看到AOP的威力了,倒就因為這個后面郁悶好久,這是后話!

    寫點什么代碼呢,初次使用,當然是越簡單越好,但我對AspectJ的語法一竅不通啊。想到網上搜索,又覺得不系統,而且大部分文章都是講AspectJ的好處,講到具體使用卻很少。正郁悶時看到eclipse的help菜單,想想說不定有幫助。打開help content,果然多了AspectJ Language GuideAspectJ Development User Guide目錄。這其實有點出乎我的意外,eclipse插件我也裝了不少,如tomcat,lomboz等,但都沒有幫助文檔的,看來AJDT就是考慮的周到,這也大大增加了我對AspectJ的好感,得好好研究研究!文檔當然都是英文,但這可難不倒俺,當程序員的英文其它水平不行,說到“讀”那卻肯定沒問題的。瀏覽了下這些help,找了篇Getting Started的Basic tutorial就跟著做了,新建項目,新建個叫Hello的類,代碼很少,就是打印“Hello”。

     

    1public static void main(String[] args) {
    2     sayHello();
    3}
     
    4
    5public static void sayHello() {
    6     System.out.print("Hello");
    7}
     

     

    然后新建個aspect,叫World吧,代碼也很簡單,拷貝過去先:

    1public aspect World 
    2     pointcut greeting() : execution(*Hello.sayHello(..)); 
    3
    4     after() returning() : greeting() 
    5         System.out.println(" World!"); 
    6     }
     
    7
    8}

     

    AspectJ語法我不懂,但英文還認識,pointcut就是切點的意思,這段代碼估計就是在執行Hello.sayHello方法后,打印一個“World!”,但*和..是啥意思我就不大了解了。先急著看效果,我就運行Hello類了,當然我按照文檔做,要run as AspectJ/Java application。運行結果:“Hello”。咋不對呢,難道我寫錯了?先刪除代碼,這次不拷貝了,自己手寫。還真認識pointcut,after這些關鍵字,會高亮顯示,邊打邊就報錯,打全了函數就好了,這跟java的靜態檢查完全一樣嘛。試著刪除*,報錯,刪除..,好像沒事,刪除returning(),好像也沒事,我這純粹是盲人摸象嘛!呵呵,沒辦法,我就這性格。倒也增加了幾分對了解其語法的渴望。但現在我還不看,第一次運行,連個象樣的結果還沒出來啊,這不是打擊我積極性嗎?手工輸入了一遍,沒錯誤了,運行。。。靠!還是老樣子,這什么Getting Started啊,我心中暗罵。仔細在看看文檔,好像也沒問題啊,但它說的那個Cross References顯示好像和我不一樣,看來是我的問題。出師不利啊!

    我可沒那么容易放棄,再來一遍,反正簡單,幾分鐘又好了,但結果還是一樣。我郁悶啊!失意中我瞎點點,打開了那個property文件,還是圖形化的呢。誒,好像那個World.aj沒勾上,難道因為這個?仔細看看說明,included files…對了,AspectJ的特性就是需要用自己的acj編譯器進行編譯,這可能就是編譯的類列表。勾上,保存文件,果然開始編譯,運行。。。結果為:“Hello World!”成功了,哈哈,這可是俺的第一個AOP成功案例啊!興奮中想起AspectJ要用自己的編譯器編譯,編譯出來是.class文件,但肯定往里面加了些東西。于是到eclipse的workspace中找編譯出來的class文件,雙擊打開(嘿嘿!俺有小穎,自動反編譯),這就是經AspectJ編譯后的Hello類代碼,原來加了行語句。

    1    public static void sayHello()
    2
    3    {        System.out.print("Hello");       
                       World.aspectOf().ajc$afterReturning$helloworld_World$
    1$f69f5afa();
    4
    5         }

    6

    World.aj也編譯成了World.class,代碼較長:

     1package helloworld;
     2
     3import java.io.PrintStream;
     4
     5import org.aspectj.lang.NoAspectBoundException;
     6
     7public class World
     8
     9{
    10
    11    private static Throwable ajc$initFailureCause;
    12
    13    public static final World ajc$perSingletonInstance;
    14
    15    public World()
    16
    17    {
    18
    19    }

    20
    21    public void ajc$afterReturning$helloworld_World$1$f69f5afa()
    22
    23    {
    24
    25        System.out.println("World!");
    26
    27    }

    28
    29    public static World aspectOf()
    30
    31    {
    32
    33        if(ajc$perSingletonInstance == null)
    34
    35            throw new NoAspectBoundException("helloworld_World", ajc$initFailureCause);
    36
    37        else
    38
    39            return ajc$perSingletonInstance;
    40
    41    }

    42
    43    public static boolean hasAspect()
    44
    45    {
    46
    47        return ajc$perSingletonInstance != null;
    48
    49    }

    50
    51    private static void ajc$postClinit()
    52
    53    {
    54
    55        ajc$perSingletonInstance = new World();
    56
    57    }

    58
    59    static 
    60
    61    {
    62
    63        try
    64
    65        {
    66
    67            ajc$postClinit();
    68
    69        }

    70
    71        catch(Throwable throwable)
    72
    73        {
    74
    75            ajc$initFailureCause = throwable;
    76
    77        }

    78
    79    }

    80
    81}

    82

    研究一下:也就是生成個默認構造函數的World類,加了個ajc$afterReturning$helloworld_World$1$f69f5afa()方法,其它好像都是AspectJ生成的class必帶的代碼,定義了一個public static final World ajc$perSingletonInstance的類,還有一個private static Throwable ajc$initFailureCause異常,public static World aspectOf()和public static boolean hasAspect()會被自動調用。這就是AspectJ能運行的原理了,當然還有更復雜的東西,但從這個最簡單的例子也能了解些端倪了。

    接下來就是學習它的語法了,其實也不難(我就奇怪網上把AspectJ的學習曲線說的多陡峭,比java難多少),也就是pointcut和advice,各自有各自的一些關鍵字。我也對開始瞎試,有的報錯,有的不報錯的原因有了理論的認識了。

    整個探索的時間也不長,1個小時左右,比我寫這篇東西少多了,呵呵!打字打的累啊,回去打星際去!看哪天有空,接著研究,也一定寫篇文章,估計也還有人看的,呵呵!

    posted on 2005-08-03 19:00 pesome 閱讀(4487) 評論(4)  編輯  收藏 所屬分類: AOP

    評論

    # re: AspectJ初探 2006-12-14 18:03 Brian Sun

    你用的自動反編譯工具是什么?呵呵,也想搞個玩玩。
      回復  更多評論   

    # re: AspectJ初探 2006-12-15 09:34 pesome

    以前用小穎,現在用jad  回復  更多評論   

    # re: AspectJ初探 2008-09-01 17:44 yyyfff43

    強文兒,頂
    aspectj確實不錯  回復  更多評論   

    # re: AspectJ初探[未登錄] 2011-10-26 21:01 beansoft

    拜讀下!  回復  更多評論   


    只有注冊用戶登錄后才能發表評論。


    網站導航:
    相關文章:
     
    <2005年8月>
    31123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    導航

    統計

    公告

    主要記錄作者在學習java中的每一步足跡。除非特別說明,所有文章均為本blog作者原創,如需轉載請注明出處和原作者,如用于商業目的,需跟作者本人聯系。
    歡迎大家訪問:

    常用鏈接

    留言簿(16)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    相冊

    收藏夾

    java技術

    人間百態

    朋友們的blog

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲高清成人一区二区三区 | 黄色网址免费在线| 日韩成人在线免费视频| 久久永久免费人妻精品| 国产免费久久精品久久久| 无码国产精品一区二区免费式直播| 免费无码又爽又刺激网站直播 | 亚洲中文字幕伊人久久无码| 国产精品久久久久久久久久免费 | 久久久久国产成人精品亚洲午夜 | 免费的黄色的网站| 亚洲av永久中文无码精品综合| 亚洲欧洲视频在线观看| 亚洲一区二区三区四区在线观看| 亚洲精品无码高潮喷水在线| 国产亚洲成人在线播放va| 成全影视免费观看大全二| 男女超爽刺激视频免费播放| 人妻丰满熟妇无码区免费| 久操免费在线观看| 国产免费一区二区三区在线观看| 你懂得的在线观看免费视频| 鲁死你资源站亚洲av| 亚洲人成网男女大片在线播放 | 男女猛烈无遮掩视频免费软件| 久久精品国产亚洲av天美18| 亚洲精华液一二三产区| 精品国产日韩亚洲一区91 | 日韩免费a级在线观看| 成人免费午夜视频| 国产区卡一卡二卡三乱码免费| 国产高清在线免费| 337p日本欧洲亚洲大胆人人| 亚洲AV成人精品日韩一区| 9久久免费国产精品特黄| 亚洲国产精品免费在线观看| 天天摸天天操免费播放小视频| 亚洲日韩国产一区二区三区| 亚洲综合无码一区二区| 亚洲爆乳无码精品AAA片蜜桃| 国产视频精品免费视频|