让我们想象以下方面:
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) ...;
}
}
Run Code Online (Sandbox Code Playgroud)
切入点捕获对公共方法的所有调用,Server并在调用before任何这些方法之前运行建议.
是否可以检索在通知中执行对公共Server方法的调用的对象实例before?如果有,怎么样?
你可以使用this()切入点:
pointcut services(Server s, Object o) : target(s) && this(o) && call....
Run Code Online (Sandbox Code Playgroud)
显然,如果需要对其进行范围化,则可以使用特定类型而不是Object.
编辑
您还可以使用thisJoinPoint变量:
Object o = thisJoinPoint.getThis();
Run Code Online (Sandbox Code Playgroud)
虽然与使用特定切入点相比,使用thisJoinPoint通常会导致较小的性能损失,但是如果调用者是静态类,则可以使用它.
在这种情况下,没有"this",因此这个(o)可能无法匹配,并且thisJoinPoint.getThis()返回null.
但是,使用:
Class c = thisEnclosingJoinPointStaticPart.getSignature().getDeclaringType();
Run Code Online (Sandbox Code Playgroud)
会告诉你包含静态方法的类.探索签名上的更多字段也可以为您提供方法名称等.