AspectJ pointcuts - получить ссылку на класс и имя точки подключения

Я использую стиль @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()]

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

Ответы

Ответ 1

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

Ответ 2

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

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