关注程序作用域,限制捕获连接点的范围。比如捕获在特定类,包中的连接点
捕获特定类中的所有连接点
within(TypePattern)
Picks out each join point where the executing code is defined in a type matched by TypePattern.

within捕获特定类中的连接点
捕获特定包中的所有连接点
同上,也用 within(TypePattern)
捕获特定方法内的所有连接点
withincode(MethodPattern)
Picks out each join point where the executing code is defined in a method whose signature matches MethodPattern.

withincode捕获特定方法的所有连接点
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 {
//捕获特定类中所有连接点
pointcut withinMyClass(): within(MyClass);
before() : withinMyClass() {
System.out.println("withinMyClass");
System.out.println(thisJoinPoint.getSignature());
System.out.println(thisJoinPoint.getSourceLocation());
}
//捕获特定包中所有连接点
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());
}
//捕获特定方法内所有连接点
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
思考
上面例子是捕获特定类,包,方法中的所有连接点,实际应用场景应该和其他pointcut结合在一起使用
这个语法习惯之后,越写越快
refer
https://eclipse.org/aspectj/doc/released/progguide/semantics-pointcuts.html
《aspectj cookbook》