2011-09-08 2 views
6

은의 다음과 같은 측면을 가정 해 봅시다 :AspectJ로 메소드 호출을 수행하는 객체 인스턴스를 검색 할 수 있습니까?

aspect FaultHandler { 

    pointcut services(Server s): target(s) && call(public * *(..)); 

    before(Server s): services(s) { 
    // How to retrieve the calling object instance? 
    if (s.disabled) ...; 
    } 

} 

포인트 컷은 Server의 공개 방법에 대한 모든 호출을 포착하고이 중 하나가 호출 직전에 before 조언을 실행합니다.

before 조언에 공개 Server 메서드에 대한 호출을 수행하는 개체 인스턴스를 검색 할 수 있습니까? 그렇다면 어떻게? 당신이이() 포인트 컷 사용할 수 있습니다

답변

4

: 당신이 범위 그것을 필요로하는 경우 분명히

pointcut services(Server s, Object o) : target(s) && this(o) && call.... 

, 당신은 대신 객체의 특정 유형을 사용할 수 있습니다.

편집

당신은 또한 thisJoinPoint 변수를 사용할 수 있습니다 thisJoinPoint는 종종 특정 포인트 컷을 사용하는 것에 비해 성능이 약간 저하에 부과 사용하는 동안

Object o = thisJoinPoint.getThis(); 

을,이 경우에 사용할 수있는 호출자가있다 정적 클래스.

이 경우 "this"가 없기 때문에이 (o)가 일치하지 않을 수 있으며 thisJoinPoint.getThis()는 null을 반환합니다. 사용하지만

:

Class c = thisEnclosingJoinPointStaticPart.getSignature().getDeclaringType(); 

당신에게 정적 메소드를 포함하는 클래스를 말할 것이다. 서명에 대한 더 많은 필드를 탐색하면 메소드 이름 등을 줄 수도 있습니다.

+0

그래서 'o'가 제 방법의 호출자가 될 것입니까? 서버 메소드가 정적 코드에서 호출 되더라도? – JVerstry

+1

@JVerstry : [문서] (http://www.eclipse.org/aspectj/doc/released/progguide/semantics-pointcuts.html)에 'this' 포인트 컷이 정적 컨텍스트의 조인 포인트와 일치하지 않는다고 나와 있습니다 . " –

+0

문서화는 "정적 메서드 실행의 경우에는이 메서드가 없으므로 this()"를 사용하여 캡처 할 수 없다는 것을 의미한다고 생각합니다. –