[英]How can I write a pointcut expression that doesn't require AspectJWeaver
[英]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.