目前我有一个切入点可以捕获父类对方法的调用。
我拥有的是:
@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();
}
呼叫不会被拦截,因为没有截击它的切入点。
答案 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