java—仅当从某个类调用某个方法时才截获该方法?

jogvjijk  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(413)

使用aspectj或SpringAOP(无所谓),只有在从某个类中调用某个方法时,才有可能截获该方法吗?
例子:

public class House() {

    String address;

    public House(String address) {
       this.address = address;
    }   

    public String getAddress() {
      return this.address();
   }
}

public class BadHouse() {

    public void doNotIntercept() {
      House h = new House("1234");
      h.getAddress();
   }
}

public class GoodHouse() {

     public void intercept() {
     House h = new House("4567");
     h.getAddress();
    }

}

public class houseInterceptor() {

     @Before("execution(com.example.House.getAddress(..))")
     // only intercept on GoodHouse.class??? 
     public void beforeGetAddress();

}

在这种情况下可以使用“within”吗?谢谢您

ibrsph3r

ibrsph3r1#

使用aspectj或SpringAOP(无所谓),只有在从某个类中调用某个方法时,才有可能截获该方法吗?
aspectj是可能的(无论是否从spring内部使用,这都无关紧要),但SpringAOP是不可能的,因为您需要这样做
或者结合使用 call() 切入点和 JoinPoint.EnclosingStaticPart (注解样式)或 thisEnclosingJoinPointStaticPart (本机语法),当且仅当要检查直接调用方时,
或者结合使用 call() 切入点和 this() ,当且仅当您要检查直接呼叫者时,
或者结合使用 call() 或者 execution() 以及 cflow() 或者 cflowbelow() 如果要检查可能的间接调用方(例如。 GoodHouseFooHouse ).
上面所有这些只在aspectj中工作的原因是SpringAOP既不支持 call() 也不是 cflow() ,如本文所述。
在这种情况下可以使用“within”吗?
不, within() 在这种情况下帮不了你。
更新:以下是我的其他答案: call() +
thisEnclosingJoinPointStaticPart call() +
JoinPoint.EnclosingStaticPart call() +
this() call() + cflow() ,可选择与 this() 并展示如何使用 thisEnclosingJoinPointStaticPart 为什么? thisEnclosingJoinPointStaticPart 直接打电话的人比 Throwable.getStackTrace() 更新2:一个更未知的角落或Springaop是 ControlFlowPointcut 班级。spring手册简单地提到了它,没有示例,但是spring源代码中有一个测试,我在第三方网站上找到了一个示例。它不能帮助您直接解决问题,但我可以想出一个解决方案,在该解决方案中,您可以为每个允许的源类创建一个这样的切入点,并将每个切入点链接到实现所需方面行为的同一个advisor。这将是缓慢的,因为spring使用反射和调用堆栈,需要一些样板代码来手动连接所有内容,但它可以工作。

相关问题