aspectj 9 捕获程序作用域内的连接点

关注程序作用域,限制捕获连接点的范围。比如捕获在特定类,包中的连接点

捕获特定类中的所有连接点

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》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容