Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以检索使用AspectJ执行方法调用的对象实例?_Java_Aspectj - Fatal编程技术网

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
建议中检索执行对public
Server
方法调用的对象实例?如果是,如何使用?

您可以使用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这个封闭的连接点静态部分是什么?它的定义是什么?