首页 > 解决方案 > 使用 AspectJ 根据类型隔离具有相同名称的方法?

问题描述

假设我对该run()方法有一个切入点。

pointcut run(): execution(public void *.run());
before(): run() {
    // do something with run
}

但我只想捕捉一些运行实例。例如:

new Thread(new Runnable() {
    @Override
    public void run() {
        // this run should be intercepted
    }
});

new Timer().scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        // this run should be ignored
    }
}, 0, 1000);

如何更改我的切入点以忘记run()不是来自线程的?

标签: javaaspectj

解决方案


如果您想建议该Runnable.run()方法的所有实现,除非提供该 run 方法的实现的类是 的子类TimerTask,可以使用以下切入点表达式有效地完成:

execution(public void Runnable+.run()) && !execution(public void java.util.TimerTask+.run());

推荐阅读