2012-08-31 3 views
6

간결한 제목을 만드는 것은 어렵습니다.컷이 수퍼 클래스에 있지만 파생 클래스가 재정의 될 때 pointcut을 두 번 치는 것을 피하는 방법은 무엇입니까?

어쨌든

, 나는 부모 클래스가 상상 :

public class Shape { 
     public Dimensions getDimensions() { 
      // Does some generic stuff. 
     } 
    } 

을 내가 가지고있는 getDimensions 방법에 우선 그것에서 파생 된 클래스 : 나는 Shape.getDimensions에 포인트 컷과 측면을 만들 때

public class Circle extends Shape { 
     public Dimensions getDimensions() { 
      // Does some stuff. 
      super.getDimensions(); 
     } 
    } 

Circle.getDimensions이 호출되면 포인트 컷은 두 번 히트됩니다 : Circle.getDimensions에 대해 한 번, super.getDimensions에 대해 한 번 호출됩니다.

포인트 컷은 다음과 같이 보입니다 : @Pointcut("execution(* Shape.getDimensions(..))")

내가 (JoinPoint.getSignature().getDeclaringType().getName() 사용) 선언 형식의 이름을 확인하기 위해 조언을 내부에 해킹을 추가했습니다,하지만 난 그게 오히려 총 찾아서 해킹과 같은 종류의 느낌 . 나는 이것을하기위한 더 좋은 방법이 있어야한다고 생각한다.

있습니까?

서식이 좋지 않은 경우 사과드립니다. 처음 여기에 질문을합니다. (저는 이미 답을 찾을 수 있습니다).

답변

5

아마 당신의 포인트 컷이 Shape+.getDimensions() (더하기 기호와 함께)을 사용한다는 것을 의미 할 것입니다. 그렇지 않으면 Circle과 전혀 일치하지 않을 것입니다.

어쨌든,이 같은 문제를 해결할 수 있습니다 (I 네이티브 AspectJ를 구문이 당신을 위해 좋아 희망, 나는 그것을 훨씬 선명하고 더 표현 찾기) :

public aspect ShapeAspect { 
    pointcut getDimensions() : execution(* Shape+.getDimensions()); 
    pointcut getDimensionsNoSuper() : getDimensions() && !cflowbelow(getDimensions()); 

    after() : getDimensionsNoSuper() { 
     System.out.println(thisJoinPointStaticPart); 
    } 
} 
+0

작품 아름답게, 감사합니다. 나는 주석 스타일에 익숙하지만 키는 cflowbelow 호출이었다. 내가 그것을 하나의 충고로 요약 할 수 있는지를 알아 내려고 노력하면서 (나는 그것을 알 수 없었다), 나는이 아름다운 부록을 발견했다 : http://www.eclipse.org/aspectj/doc/next/progguide/ semantics-pointcuts.html – Depressio

+0

미리 답변 해 주셔서 감사합니다. ;-) 제발. – kriegaex

+0

나는 15 점이 분명히 필요하다. 나는 단지 11을 가지고있다. 나를 믿어라, 나는 시험했다! : – Depressio