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
의 인스 타 스먼트에서 aspect 출력을 표시하지만, 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]
pointcut에서 "if"문을 사용할 수 있습니다. call (public void A.method (..)) && target (instance) && if (! 인스턴스 instanceof B)). - https://eclipse.org/aspectj/doc/next/adk15notebook/ataspectj-pcadvice.html – Lin
@Lin을 참조하십시오. pointcut에서 if 문을 사용할 수 있다는 사실을 전혀 알지 못했고, 더 많은 것을 테스트 할 것입니다. 단 한가지는 내가 할 것이라고 생각하지 않는다! instanceof 그러면 각 하위 클래스에 하나씩 포함시켜야하기 때문에 if (instance.getClass() == A.class) 라인을 따라 뭔가를 시도 할 것이다. 감사! – jhwang