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
Test.java
4. 编译,运行
结果
[quote]
Wanna learn AspectJ?
Harry, having fun?
round
[/quote]
5. 加入切面,编译运行
MannersAspect.java
结果
[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要重新编译
如果对应的类没有重新编译,则切面不会生效
[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要重新编译
如果对应的类没有重新编译,则切面不会生效