Можно ли получить экземпляр объекта, выполняющего вызов метода с AspectJ? - PullRequest
9 голосов
/ 08 сентября 2011

Давайте представим следующий аспект:

 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) ...;
   }

 }

Pointcut захватывает все вызовы открытых методов Server и выполняет рекомендацию before непосредственно перед вызовом любого из них.

Можно ли получить экземпляр объекта, выполняющий вызов общедоступного метода Server в рекомендации before?Если да, то как?

1 Ответ

8 голосов
/ 08 сентября 2011

Вы можете использовать pointcut this ():

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

Очевидно, что вы можете использовать определенный тип вместо Object, если вам нужно его охватить.

EDIT

Вы также можете использовать переменную thisJoinPoint:

Object o = thisJoinPoint.getThis();

Хотя использование thisJoinPoint часто приводит к небольшим потерям производительности по сравнению с использованием определенных pointcut, его можно использовать в случае, если вызывающий объект является статическим классом.

В этом случае «this» отсутствует, поэтому this (o) может не совпадать, и thisJoinPoint.getThis () возвращает ноль.

Однако, используя:

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

Расскажет вам класс, содержащий статический метод. Изучение дополнительных полей подписи также может дать вам имя метода и т. Д.

...