gpt4 book ai didi

logging - AspectJ 切入点 - 获取对连接点类和名称的引用

转载 作者:行者123 更新时间:2023-12-03 12:34:22 27 4
gpt4 key购买 nike

我正在使用 @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() .由于您正在使用建议调用加入点,因此您感兴趣的对象是调用的目标。

请注意 API specification states :

Returns the target object. This will always be the same object as that matched by the target pointcut designator. Unless you specifically need this reflective access, you should use the target pointcut designator to get at this object for better static typing and performance.

Returns null when there is no target object.



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

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

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

关于logging - AspectJ 切入点 - 获取对连接点类和名称的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5069293/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com