是否可以检索使用AspectJ执行方法调用的对象实例?

时间:2011-09-08 17:32:44

标签: java aspectj

让我们想象以下方面:

 aspect FaultHandler {

   pointcut services(Server s): target(s) && call(public * *(..));

   before(Server s): services(s) {
     // How to retrieve the calling object instance?
     if (s.disabled) ...;
   }

 }

切入点捕获对Server的公共方法的所有调用,并在调用其中任何一个之前运行before建议。

是否可以在Server建议中检索执行公共before方法调用的对象实例?如果是,怎么样?

1 个答案:

答案 0 :(得分:8)

你可以使用this()切入点:

pointcut services(Server s, Object o) : target(s) && this(o) && call....

显然,如果需要对其进行范围化,则可以使用特定类型而不是Object。

修改

您也可以使用thisJoinPoint变量:

Object o = thisJoinPoint.getThis();

与使用特定切入点相比,使用thisJoinPoint通常会导致较小的性能损失,但如果调用者是静态类,则可以使用它。

在这种情况下,没有“this”,所以这个(o)可能无法匹配,而thisJoinPoint.getThis()返回null。

但是,使用:

Class c = thisEnclosingJoinPointStaticPart.getSignature().getDeclaringType();

会告诉你包含静态方法的类。在签名上探索更多字段也可以为您提供方法名称等。