http://www.ibm.com/developerworks/cn/java/l-aspectJ/index.html中介紹了What is AspectJ 。
- AspectJ是一個代碼生成工具(Code Generator)。
- AspectJ語法就是用來定義代碼生成規則的語法。您如果使用過Java Compiler Compiler (JavaCC),您會發現,兩者的代碼生成規則的理念驚人相似。
- AspectJ有自己的語法編譯工具,編譯的結果是Java Class文件,運行的時候,classpath需要包含AspectJ的一個jar文件(Runtime lib)。
- ....
看了上面幾點,我就想看看它怎么把代碼生成了。現在做一個試驗。
一個類(包括main函數):Speaker.java






















一個aspect:AspectObserver.aj



















以上都是源碼部分哦。
運行結果:




說明程序是正常運作的哦。
好了,下面,做三個操作:
1、將以上的編譯成的class文件打包成apectjtest.jar文件。
說明:可以使用ajdt的eclipse插件帶的導出功能,Export --> JAR file with ApectJ support
2、新建一個AspectJ工程,將apectjtest.jar加入類路徑,使用jad來反編譯Speaker.class和AspectObserver.class
得到反編譯后的源碼:
Speaker.class










































AspectObserver.class























































































3、運行一下Speaker.class
得到結果:




呵呵,結果跟源碼運行是一樣的哦(不一樣就是你的人品問題咯?。。?/p>
分析一下,先理解AspectJ編譯器為我們做了什么事情:






好了,回頭看看反編譯后的Speaker.class,與源碼Speaker.java差別在哪呢?主要在main函數中,方法被調用的前后









不同的地方就是多出了兩行,雖然有$和數字,但是很容易看出,這同我們平常寫的java代碼差不了多少。

這行代碼中,看起來不就是AspectObserver類調用了靜態方法aspectOf()嗎,接著aspectOf()的返回對象又調用ajc$before$test_aspectj_AspectObserver$1$b2b6354()方法嗎?
回來看看AspectObserver.class的反編譯代碼,哈哈,這就對了,aspectOf返回的是AspectObserver的一個實例,返回實例在調用實例方法ajc$before$test_aspectj_AspectObserver$1$b2b6354()。ajc$before$test_aspectj_AspectObserver$1$b2b6354()是干什么的呢?呵呵,不正是我們要的攔截方法所要做的操作嗎?

同樣,可知

是怎么一回事啦。
這正是應了上面所提的兩點:
- AspectJ是一個代碼生成工具(Code Generator)。
- AspectJ語法就是用來定義代碼生成規則的語法。
用這兩點去感受apectj在程序里該如何去運用使用,就清晰多啦!