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

标签 logging aop aspectj

我正在使用 @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/

相关文章:

azure - 如何在 Application Insights 中查看日志?

java - 特定类构造函数的切入点执行

java - 如果无法找到/放置运行给定的方面文件,如何强制 AspectJ 抛出运行时错误?

java - 是否有适用于所有类(而非接口(interface))的 AspectJ TypePattern?

java - 检查建议是否得到应用

django - 即使 DEBUG=False 也记录 SQL 查询

ios - 使用 cocoaLumberjack 将日志文件存储在哪里

java - 如何访问aspectj中的私有(private)变量

java - CruiseControlException "log.xml does not exist"帮助

Java继承与OOP和AOP