簡體   English   中英

如何編寫不捕獲子類的切入點?

[英]How do I write a pointcut that doesn't catch subclasses?

目前,我有一個切入點,可以捕獲父類對方法的調用。

我所擁有的是:

@After("call (public void ParentInterface.method(..)) && target(instance)")
public void intercept(A instance) {
}

我的繼承結構是B, A 則是 ParentInterface 我不希望切入點截取B調用method()的任何實例。 這可能嗎?

編輯:我不希望它是:

@After("call (public void A.method(..)) && target(instance)")

因為那樣的話就存在一個for循環:

for(ParentInterface obj:list) {
   obj.method();
}

該呼叫不會被攔截,因為沒有切入點可以截取該呼叫。

AFAIK,很遺憾,您不能使用切入點直接執行此操作,但可以在建議中使用反射:

package de.scrum_master.app;

public interface ParentInterface {
    void myMethod();
}
package de.scrum_master.app;

public class A implements ParentInterface {
    @Override
    public void myMethod() {
        System.out.println("  myMethod -> " + this + "\n");
    }
}
package de.scrum_master.app;

public class B extends A {
    public void doSomething() {
        System.out.println("  doSomething -> " + this);
        myMethod();
    }

    public static void main(String[] args) {
        new A().myMethod();
        new B().doSomething();

        ParentInterface[] objects = { new A(), new B(), new A(), new B() };
        for (ParentInterface object : objects)
            object.myMethod();
    }
}
package de.scrum_master.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;

import de.scrum_master.app.A;

@Aspect
public class MyAspect {
    @After("call(public void de.scrum_master.app.ParentInterface.myMethod(..)) && target(instance)")
    public void intercept(A instance, JoinPoint thisJoinPoint) {
        if (instance.getClass() != A.class)
            return;
        System.out.println(thisJoinPoint);
    }
}

現在,請注意日志輸出如何僅在完全為A實例上顯示方面輸出,而不是在諸如B子類上顯示:

call(void de.scrum_master.app.A.myMethod())
  myMethod -> de.scrum_master.app.A@4a574795

  doSomething -> de.scrum_master.app.B@f6f4d33
  myMethod -> de.scrum_master.app.B@f6f4d33

call(void de.scrum_master.app.ParentInterface.myMethod())
  myMethod -> de.scrum_master.app.A@23fc625e

  myMethod -> de.scrum_master.app.B@3f99bd52

call(void de.scrum_master.app.ParentInterface.myMethod())
  myMethod -> de.scrum_master.app.A@4f023edb

  myMethod -> de.scrum_master.app.B@3a71f4dd

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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