簡體   English   中英

為什么這個 AspectJ 方法簽名表達式匹配子類型中的覆蓋方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM