據我所知,不幸的是你不能直接跟一個切入點做到這一點,但你可以在你的建議使用反射來代替:
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 -> [email protected]
doSomething -> [email protected]
myMethod -> [email protected]
call(void de.scrum_master.app.ParentInterface.myMethod())
myMethod -> [email protected]
myMethod -> [email protected]
call(void de.scrum_master.app.ParentInterface.myMethod())
myMethod -> [email protected]
myMethod -> [email protected]
您可以在切入點中使用「if」語句 - 如下所示:call(public void A.method(..))&& target(instance)&& if(! instanceof B))。請參閱 - https://eclipse.org/aspectj/doc/next/adk15notebook/ataspectj-pcadvice.html – Lin
@林完全沒有注意到,如果在切入點中的語句可以測試更多。唯一的事情是我不認爲我會這麼做!因爲那麼我將不得不爲每個子類包含一個,我可能會嘗試沿着if(instance.getClass()== A.class)的行。謝謝! – jhwang