让我们想象以下方面:
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
方法调用的对象实例?如果是,怎么样?
答案 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();
会告诉你包含静态方法的类。在签名上探索更多字段也可以为您提供方法名称等。