aspectJ 簡單例子

1.下載
[url=http://www.eclipse.org/aspectj/downloads.php#stable_release]http://www.eclipse.org/aspectj/downloads.php#stable_release[/url]下載AspectJ的最新穩定版本

2. 安裝是java -jar aspect-1.6.9.jar
安裝後配置好path跟classpath可以直接使用ajc命令
這裏沒有安裝,直接解壓了

3.兩個測試類
HelloWorld.java

package aaa;
public class HelloWorld {
public static void deliver(String message) {
System.out.println(message);
}

public static void deliver(String person, String message) {
System.out.println(person + ", " + message);
}

public static void round(String s){
System.out.println(s);
}
}

Test.java

package aaa;
public class Test {
public static void main(String[] args) {
HelloWorld.deliver("Wanna learn AspectJ?");
HelloWorld.deliver("Harry", "having fun?");
HelloWorld.round("round");
}
}


4. 編譯,運行
java -cp aspectjtools.jar;aspectjrt.jar;classes org.aspectj.tools.ajc.Main -d classes src/aaa/*.java
java -cp classes;aspectjrt.jar aaa.Test

結果
[quote]
Wanna learn AspectJ?
Harry, having fun?
round
[/quote]
5. 加入切面,編譯運行
MannersAspect.java

package aaa;
aspect MannersAspect {
// 定義切點 並且指明在哪個方法
pointcut deliverMessage() : call(* HelloWorld.deliver(..));

pointcut afterMessage() : execution (* HelloWorld.deliver(..));

pointcut roundMessage(String s) : call (* HelloWorld.round(String)) && args(s);
// 方法前攔截
before() : deliverMessage() {
System.out.println("before! ");
}

// 方法後攔截
after() : afterMessage(){
System.out.println("after! ");
}

void around(String s) : roundMessage(s) {
System.out.println("around before! ");

proceed("99 "+s+" 00 ");
System.out.println("around after! ");
}

}


java -cp aspectjtools.jar;aspectjrt.jar;classes org.aspectj.tools.ajc.Main -d classes src/aaa/*.java
java -cp classes;aspectjrt.jar aaa.Test

結果
[quote]
before!
Wanna learn AspectJ?
before!
Harry, having fun?
around before!
99 round 00
around after!
[/quote]

6. call 與 execution的區別
call是在調用方法的地方加入切點,會修改Test類
execution是在方法執行的地方加入切點,會修改HelloWorld類

call的切面需要aspect與call調用的類都重新編譯,MannersAspect與Test要重新編譯
execution需要aspect與方法定義的類重新編譯,即MannersAspect與HelloWorld要重新編譯
如果對應的類沒有重新編譯,則切面不會生效
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章