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

时间:2011-02-21 17:42:23

标签: 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()]

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

2 个答案:

答案 0 :(得分:28)

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

请注意API specification states

  

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

     

当没有目标对象时返回null。

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

final Signature signature = joinPoint.getSignature();

然后:

final Class clazz = signature.getDeclaringType();

或者如果您需要的只是班级名称:

final String clazz = signature.getDeclaringTypeName();

答案 1 :(得分: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());
    }
} 

可以帮助某人:使用上面的代码来获取所请求的类,方法和参数。