![](/img/trans.png)
[英]Trying to match an AspectJ pointcut signature for any methods containing a variable
[英]Why does this AspectJ method signature expression match overwritten methods in subtypes?
我定義了兩個類
public class A{
public A myMethod(){
return this;
}
}
public class B extends A{
@Override public B myMethod(){
return this;
}
}
和切入點execution(public A+ A.*(..))
。
我很驚訝這兩種方法都被切入點選中。 即使我沒有在myMethod()
的定義類型的類型名稱后添加加號,為什么會出現這種情況?
如果+
已經存在匹配子類型,為什么 AspectJ 的設計不一致?
方法執行被捕獲,因為您正在攔截基類中定義的方法。 當在子類中被覆蓋時,它仍然會匹配。 切入點不會僅匹配子類中定義的任何方法。
讓我重命名您的類以使代碼更具可讀性並將其轉換為MCVE :
基類:
package de.scrum_master.app;
public class Base {
public Base baseAction() {
return this;
}
}
具有重寫方法的子類:
package de.scrum_master.app;
public class Sub extends Base {
@Override
public Sub baseAction() {
return this;
}
public Sub subAction() {
return this;
}
}
請注意,我向子類添加了另一個方法,該方法未包含在基類中。
驅動程序應用:
package de.scrum_master.app;
public class Application {
public static void main(String[] args) {
new Base().baseAction();
System.out.println("-----------------");
new Sub().baseAction();
System.out.println("-----------------");
new Sub().subAction();
}
}
方面:
package de.scrum_master.app;
import de.scrum_master.app.Base;
public aspect MyAspect {
before() : execution(Base Base.*(..)) {
System.out.println("Base Base.*(..) -> " + thisJoinPoint);
}
before() : execution(Base+ Base.*(..)) {
System.out.println("Base+ Base.*(..) -> " + thisJoinPoint);
}
before() : execution(Base Base+.*(..)) {
System.out.println("Base Base+.*(..) -> " + thisJoinPoint);
}
before() : execution(Base+ Base+.*(..)) {
System.out.println("Base+ Base+.*(..) -> " + thisJoinPoint);
}
}
控制台日志:
Base Base.*(..) -> execution(Base de.scrum_master.app.Base.baseAction())
Base+ Base.*(..) -> execution(Base de.scrum_master.app.Base.baseAction())
Base Base+.*(..) -> execution(Base de.scrum_master.app.Base.baseAction())
Base+ Base+.*(..) -> execution(Base de.scrum_master.app.Base.baseAction())
-----------------
Base Base.*(..) -> execution(Sub de.scrum_master.app.Sub.baseAction())
Base+ Base.*(..) -> execution(Sub de.scrum_master.app.Sub.baseAction())
Base Base+.*(..) -> execution(Sub de.scrum_master.app.Sub.baseAction())
Base+ Base+.*(..) -> execution(Sub de.scrum_master.app.Sub.baseAction())
-----------------
Base+ Base+.*(..) -> execution(Sub de.scrum_master.app.Sub.subAction())
如果您還在方法簽名中的類名中添加+
,您能看到Sub Sub.subAction()
是如何被捕獲的嗎? 這也是一個很好的例子,說明了+
作用以及為什么需要它。 您確實需要Base+
作為返回類型和方法簽名才能捕獲Sub Sub.subAction()
!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.