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在程序里该如何去运用使用,就清晰多啦!