AspectJ pointcuts - получить ссылку на класс и имя точки соединения - PullRequest
19 голосов
/ 21 февраля 2011

Я использую стиль @AspectJ для написания аспектов, для обработки регистрации в нашем приложении.По сути, у меня есть pointcut, настроенный так:

@Pointcut("call(public * com.example..*(..))")
public void logging() {}

, а затем совет до и после:

@Before("logging()")
public void entering() {...}
...
@After("logging()")
public void exiting() {...}

Я хочу создать журнал в этих методах следующим образомФормат:

logger.trace("ENTERING/EXITING [" className + "." + methodName "()]");

Проблема в том, что я не знаю, как получить ссылку на имена классов и методов.Я попытался:

joinPoint.getThis().getClass()

, но это, кажется, возвращает имя класса вызывающего.

class A {
    public void a() {
        B.b();
    }
}


class B {
    public void b() {
        ...
    }
}

приведет к следующему журналу

ENTERING [A.b()]

может кто-то датьнекоторая помощь о том, как получить фактический класс точки соединения и имя метода

Ответы [ 2 ]

29 голосов
/ 21 февраля 2011

Вам нужно использовать joinPoint.getTarget().getClass(). Поскольку вы используете уведомление точки соединения вызова, объект вашего интереса является целью вызова.

Обратите внимание: Состояния спецификации API :

Возвращает целевой объект. Это всегда будет тот же объект, который соответствует целевому указателю pointcut. Если вам не нужен этот рефлексивный доступ, вам следует использовать указатель целевого пункта, чтобы получить доступ к этому объекту для улучшения статической типизации и производительности.

Возвращает ноль, если целевого объекта нет.

Слепое использование joinPoint.getTarget().getClass() может привести к NullPointerException. Попробуйте использовать подпись точки соединения, например:

final Signature signature = joinPoint.getSignature();

Тогда:

final Class clazz = signature.getDeclaringType();

Или, если вам нужно только имя класса:

final String clazz = signature.getDeclaringTypeName();
2 голосов
/ 19 апреля 2017
    public void logBefore(JoinPoint joinPoint) {
    logger.info("###### Requested class : {} ; Method : {} ", joinPoint.getTarget().getClass().getName(), joinPoint.getSignature().getName());
    Object[] signatureArgs = joinPoint.getArgs();
    for (Object signatureArg : signatureArgs) {
        logger.info("###### Arguments: {} ", signatureArg.toString());
    }
} 

может кому-то помочь: используйте приведенный выше код для получения запрошенного класса, метода и аргументов.

...