Java 是否可以检索使用AspectJ执行方法调用的对象实例?
让我们想象一下以下方面:Java 是否可以检索使用AspectJ执行方法调用的对象实例?,java,aspectj,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的
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
建议
是否可以在before
建议中检索执行对publicServer
方法调用的对象实例?如果是,如何使用?您可以使用this()切入点:
pointcut services(Server s, Object o) : target(s) && this(o) && call....
显然,如果需要确定对象的范围,可以使用特定类型而不是对象
编辑
也可以使用thisJoinPoint变量:
Object o = thisJoinPoint.getThis();
虽然与使用特定切入点相比,使用thisJoinPoint通常会带来较小的性能损失,但在调用方是静态类的情况下可以使用它
在这种情况下,不存在“this”,因此this(o)可能无法匹配,thisJoinPoint.getThis()返回null
但是,使用:
Class c = thisEnclosingJoinPointStaticPart.getSignature().getDeclaringType();
将告诉您包含静态方法的类。探索签名上的更多字段还可以为您提供方法名称等。那么“o”肯定会是我方法的调用者吗?即使服务器方法是从静态代码调用的?@JVerstry:the声明
this
切入点“将不匹配静态上下文中的任何连接点。”我认为文档的意思是“在静态方法执行的情况下,没有这个,因此无法使用this()捕获它”。JVersity,您找到了获取静态部分的方法吗,如果thisJoinPoint.getThis()返回null,您应该能够使用thisJoinPointStaticPart@SimoneGianni这个封闭的连接点静态部分是什么?它的定义是什么?