2011-09-08 10 views
6

Wyobraźmy sobie następujący aspekt: ​​Czy można pobrać instancję obiektu wykonującą wywołanie metody z 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) ...; 
    } 

} 

punktu przekroju przechwytuje wszystkie połączenia metod publicznych Server i prowadzi porady before tuż przed każdy z nich o nazwie.

Czy jest możliwe pobranie instancji obiektu wykonującej wywołanie do publicznej metody Server w poradniku before? Jeśli tak, w jaki sposób?

Odpowiedz

4

można użyć tego() punkt przekroju:

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

Oczywiście, można użyć zamiast konkretnego typu obiektu, jeśli trzeba zakresu it.

EDIT

Można również użyć zmiennej thisJoinPoint:

Object o = thisJoinPoint.getThis(); 

Podczas korzystania thisJoinPoint często ponoszą w małym spadku wydajności w porównaniu z zastosowaniem specyficznych punktów przekroju, może on być stosowany w przypadku, gdy rozmówca jest klasa statyczna.

W takim przypadku nie ma "to", więc to (o) może nie pasować, a tenJoinPoint.getThis() zwraca wartość null.

Jednakże, używając:

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

powie klasę, która zawiera metody statycznej. Odkrywając więcej pól na podpisie, możesz również podać nazwę metody itp.

+0

Na pewno "o" będzie rozmówcą mojej metody? Nawet jeśli metoda serwera jest wywoływana z kodu statycznego? – JVerstry

+1

@JVerstry: The [documentation] (http://www.eclipse.org/aspectj/doc/released/progguide/semantics-pointcuts.html) stwierdza, że ​​'ten' punktcut" nie będzie dopasowywał żadnych punktów łączenia z kontekstów statycznych . " –

+0

Myślę, że dokumentacja oznacza "w przypadku statycznego wykonania metody, nie ma tego, więc nie można go przechwycić za pomocą tego()". –