關(guān)注程序作用域能犯,限制捕獲連接點(diǎn)的范圍佳恬。比如捕獲在特定類涕癣,包中的連接點(diǎn)
捕獲特定類中的所有連接點(diǎn)
within(TypePattern)
Picks out each join point where the executing code is defined in a type matched by TypePattern.
within捕獲特定類中的連接點(diǎn)
捕獲特定包中的所有連接點(diǎn)
同上斤寂,也用 within(TypePattern)
捕獲特定方法內(nèi)的所有連接點(diǎn)
withincode(MethodPattern)
Picks out each join point where the executing code is defined in a method whose signature matches MethodPattern.
withincode捕獲特定方法的所有連接點(diǎn)
demo
package aspectj;
public class MyClass {
public void doSth(){
System.out.println("do");
}
public static void main(String[] args) {
MyClass myClass = new MyClass();
myClass.doSth();
}
}
package aspectj;
public aspect HelloWorld {
//捕獲特定類中所有連接點(diǎn)
pointcut withinMyClass(): within(MyClass);
before() : withinMyClass() {
System.out.println("withinMyClass");
System.out.println(thisJoinPoint.getSignature());
System.out.println(thisJoinPoint.getSourceLocation());
}
//捕獲特定包中所有連接點(diǎn)
pointcut withinPackage(): within(aspectj.*);
//該aspect也在package aspect下,因此exclude掉
before() : withinPackage() && !within(HelloWorld){
System.out.println("withinPackage");
System.out.println(thisJoinPoint.getSignature());
System.out.println(thisJoinPoint.getSourceLocation());
}
//捕獲特定方法內(nèi)所有連接點(diǎn)
pointcut withinMethod(): withincode(* MyClass.doSth());
before():withinMethod() {
System.out.println("withinMethod");
System.out.println(thisJoinPoint.getSignature());
System.out.println(thisJoinPoint.getSourceLocation());
}
}
輸出
withinMyClass
aspectj.MyClass.<clinit>
MyClass.java:0
withinPackage
aspectj.MyClass.<clinit>
MyClass.java:0
withinMyClass
void aspectj.MyClass.main(String[])
MyClass.java:8
withinPackage
void aspectj.MyClass.main(String[])
MyClass.java:8
withinMyClass
aspectj.MyClass()
MyClass.java:9
withinPackage
aspectj.MyClass()
MyClass.java:9
withinMyClass
aspectj.MyClass()
MyClass.java:3
withinPackage
aspectj.MyClass()
MyClass.java:3
withinMyClass
aspectj.MyClass()
MyClass.java:3
withinPackage
aspectj.MyClass()
MyClass.java:3
withinMyClass
aspectj.MyClass()
MyClass.java:3
withinPackage
aspectj.MyClass()
MyClass.java:3
withinMyClass
void aspectj.MyClass.doSth()
MyClass.java:10
withinPackage
void aspectj.MyClass.doSth()
MyClass.java:10
withinMyClass
void aspectj.MyClass.doSth()
MyClass.java:4
withinPackage
void aspectj.MyClass.doSth()
MyClass.java:4
withinMyClass
PrintStream java.lang.System.out
MyClass.java:5
withinPackage
PrintStream java.lang.System.out
MyClass.java:5
withinMethod
PrintStream java.lang.System.out
MyClass.java:5
withinMyClass
void java.io.PrintStream.println(String)
MyClass.java:5
withinPackage
void java.io.PrintStream.println(String)
MyClass.java:5
withinMethod
void java.io.PrintStream.println(String)
MyClass.java:5
do
思考
上面例子是捕獲特定類奕删,包,方法中的所有連接點(diǎn)疗认,實(shí)際應(yīng)用場景應(yīng)該和其他pointcut結(jié)合在一起使用
這個(gè)語法習(xí)慣之后,越寫越快
refer
https://eclipse.org/aspectj/doc/released/progguide/semantics-pointcuts.html
《aspectj cookbook》