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






















一個(gè)aspect:AspectObserver.aj



















以上都是源碼部分哦。
運(yùn)行結(jié)果:




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










































AspectObserver.class























































































3、運(yùn)行一下Speaker.class
得到結(jié)果:




呵呵,結(jié)果跟源碼運(yùn)行是一樣的哦(不一樣就是你的人品問(wèn)題咯!!)
分析一下,先理解AspectJ編譯器為我們做了什么事情:






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









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

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

同樣,可知

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