首页 > 解决方案 > 如何将两种不同的注释方法组合成一个切入点?

问题描述

我想注释 2 个不同的方法并将它们关联在一起,以匹配使用它的全局变量和方法

  @FirstAnn(funcName = "foo")
  def foo = {
    val value = boo()
    val checkValue = value > 2
    return  checkValue
  }

  @SecondAnn(funcName = "foo", paramName = "value")
  def boo : Double = {
    return B.getValue
  }




@Pointcut("execution(* *(..)) && @annotation(firstAnn) && if()")
public static boolean execute(FirstAnn firstAnn){
    return true;
}

@Pointcut("execution(* *(..)) && @annotation(secAnn) && if()")
public static boolean execute2(SecondAnn secAnn){
    return true;
}

@Before("execute(firstAnn) && execute2(secAnn)")
public void before(FirstAnn firstAnn, SecondAnn secAnn, JoinPoint.StaticPart jps,JoinPoint jp){
    if (firstAnn.funcName == secAnn.funcName){
        print("value X is used in funcname Y" ) //here I will retrieve the value from signature  like: value 3 is used in function foo
    }
}

但是代码没有到达这个地方......有什么建议可以让它工作吗?谢谢

标签: javaannotationsaspectjaspectpointcut

解决方案


您的使用&&意味着您希望两种方法同时执行。但当然不是。第一个或第二个匹配,它们是两个不同的连接点,因此将切入点组合在一起&&永远不会使您的建议方法触发。您需要使用||来匹配其中任何一个。

查看您的源代码,您可能想要的是在boo从内部调用时触发建议,foo也可能反过来。您还试图将上下文从调用方法引入被调用方法。这称为虫洞模式,另请参阅我的答案:

所以可能你想使用一个切入点

execute2(secAnn) && cflow(execute(firstAnn))

对于您的示例,或者如果您遇到第二种方法调用第一种方法的情况,则相反:

cflow(execute2(secAnn)) && execute(firstAnn)

推荐阅读