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

Java 使用AspectJ根据类型隔离具有相同名称的方法?,java,aspectj,Java,Aspectj,假设我在run()方法上有一个切入点 pointcut run(): execution(public void *.run()); before(): run() { // do something with run } 但我只想捕捉一些run的实例。例如: new Thread(new Runnable() { @Override public void run() { // this run should be intercepted }

假设我在
run()
方法上有一个切入点

pointcut run(): execution(public void *.run());
before(): run() {
    // do something with run
}
但我只想捕捉一些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()

编辑:,而下面的代码可以检查接受的答案,因为它更有效

从中很容易推断出解决方案:

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

如果要建议
Runnable.run()
方法的所有实现,除非提供该run方法实现的类是
TimerTask
的子类,则可以使用以下切入点表达式高效地执行此操作:

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

您可以很容易地区分匿名
Runnable
实例的
run
方法和匿名
TimerTask
实例,但是如果可能的话,通过合理的努力来区分结果对象实例的使用方式会困难得多。@NándorElődFekete-thks寻求帮助!这实际上是一个非常琐碎的问题,本应该判得更好。@NándorElődFekete第一个是
新线程(新可运行的
,第二个是
执行者。newSingleThreadScheduledExecutor().scheduleWithFixedDelay(new Runnable
您将如何筛选Executor one?基于建议对象的使用上下文建议代码在AspectJ中并不切实可行。我并不是说这是不可能的(毕竟它是Java的超集),但AspectJ不是为这个特定的用例而设计的。我的意思是,您希望根据创建后
Runnable
实例将发生的情况进行分支。实际上,该对象可能会发生任何事情。这可以通过AspectJ以更有效的方式完成。如果这是您打算做的,我可以为您的问题制定一个答案问题。
target(java.util.TimerTask)
切入点子表达式可以工作,但它涉及运行时测试。这意味着,在切入点表达式的上述形式中,aspectj将通知所有
void run()
方法,并在所有这些位置进行运行时测试,以筛选方法执行的目标是
TimerTask
实例的位置。使用不涉及运行时测试的更具体的切入点表达式可以更有效地实现同样的目标,如我的回答所示。这是最好的选择比我的答案还要多。非常感谢。我不打算删除我的,因为看到不理想的做事方式是有价值的,但我要指出这一点。