AspectJ切入点 - 获取对joinpoint类和名称的引用

sma*_*uel 19 logging aop aspectj

我正在使用@AspectJ样式来编写方面,以处理我们的应用程序中的日志记录.基本上我有一个切入点设置如下:

@Pointcut("call(public * com.example..*(..))")
public void logging() {}
Run Code Online (Sandbox Code Playgroud)

然后像之前和之后的建议一样:

@Before("logging()")
public void entering() {...}
...
@After("logging()")
public void exiting() {...}
Run Code Online (Sandbox Code Playgroud)

我想以下列格式创建这些方法的日志:

logger.trace("ENTERING/EXITING [" className + "." + methodName "()]");
Run Code Online (Sandbox Code Playgroud)

问题是我不知道如何获取类和方法名称的引用.我试过了:

joinPoint.getThis().getClass()
Run Code Online (Sandbox Code Playgroud)

但这似乎返回了调用者的类名.

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


class B {
    public void b() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

会导致以下日志

ENTERING [A.b()]
Run Code Online (Sandbox Code Playgroud)

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

小智 32

你需要使用joinPoint.getTarget().getClass().由于您使用的是建议呼叫加入点,因此您感兴趣的对象是呼叫的目标.

请注意API规范说明:

返回目标对象.这将始终与目标切入点指示符匹配的对象相同.除非您特别需要这种反射访问,否则应使用目标切入点指示符来获取此对象以获得更好的静态类型和性能.

没有目标对象时返回null.

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

final Signature signature = joinPoint.getSignature();
Run Code Online (Sandbox Code Playgroud)

然后:

final Class clazz = signature.getDeclaringType();
Run Code Online (Sandbox Code Playgroud)

或者,如果你需要的只是类名:

final String clazz = signature.getDeclaringTypeName();
Run Code Online (Sandbox Code Playgroud)

  • 啊,谢谢。我的问题的根本原因是我正在创建一个呼叫连接点。在这种情况下,我真正想要的是一个执行连接点。 (2认同)