使用 AspectJ 根据类型隔离具有相同名称的方法?

Isolate methods with same name based on type using 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()

编辑: 虽然下面的代码有效,但会检查 Nándor Előd Fekete 接受的答案,因为它效率更高。

AspectJ Cookbook 很容易推断出解决方案:

pointcut run(): execution(public void *.run()) && !target(java.util.TimerTask);
before(): run() {
    // do something with run, will not catch instances of TimerTask
}

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

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