我使用@AspectJ样式编写方面,以处理应用程序中的日志记录。基本上我设置了一个切入点,如下所示:

@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()]

有人可以提供一些有关如何获取实际连接点类和方法名称的帮助的方法吗

最佳答案

您需要使用joinPoint.getTarget().getClass()。由于您正在使用建议 call 连接点的建议,因此您感兴趣的对象就是 call 的目标。

请注意API specification states:



盲目使用joinPoint.getTarget().getClass()可能会导致NullPointerException。考虑使用连接点的签名,例如:

final Signature signature = joinPoint.getSignature();

然后:
final Class clazz = signature.getDeclaringType();

或者,如果您只需要类名:
final String clazz = signature.getDeclaringTypeName();

10-02 00:13