http://www.ibm.com/developerworks/cn/java/l-aspectJ/index.html中介紹了What is AspectJ 。
看了上面幾點,我就想看看它怎么把代碼生成了。現在做一個試驗。
一個類(包括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
得到結果:
呵呵,結果跟源碼運行是一樣的哦(不一樣就是你的人品問題咯!!)
分析一下,先理解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()是干什么的呢?呵呵,不正是我們要的攔截方法所要做的操作嗎?
同樣,可知
是怎么一回事啦。
這正是應了上面所提的兩點:
用這兩點去感受apectj在程序里該如何去運用使用,就清晰多啦!