如何编写一个不会捕获子类的切入点?

时间:2016-07-14 21:17:11

标签: java aspectj

目前我有一个切入点可以捕获父类对方法的调用。

我拥有的是:

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

我的继承结构 B A ParentInterface 。 我不希望切入点拦截B对方法()的任何调用实例。这可能吗?

修改 我不希望它成为:

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

因为那时有一个for循环:

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

呼叫不会被拦截,因为没有截击它的切入点。

1 个答案:

答案 0 :(得分:0)

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