使用 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());
假设我在 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());