如何将 2 种不同的注释方法组合成一个切入点?
How to combine 2 different annotated methods into a pointcut?
我想注释 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
}
}
但是代码没有到达这个地方...有什么建议可以让它工作吗?
谢谢
您对 &&
的使用意味着您希望同时执行这两种方法。但他们当然不是。第一个或第二个匹配,它们是两个不同的连接点,因此将切入点与 &&
组合永远不会触发您的建议方法。您需要使用 ||
来匹配任何一个。
查看您的源代码,您可能想要的是在从 foo
中调用 boo
时触发建议,反之亦然。您还试图将上下文从调用方法泄漏到被调用方法中。这称为 虫洞模式 ,另请参阅我的回答:
所以你可能想使用像
这样的切入点
execute2(secAnn) && cflow(execute(firstAnn))
对于您的示例,或者如果您遇到第二种方法调用第一种方法的情况,则相反:
cflow(execute2(secAnn)) && execute(firstAnn)
我想注释 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
}
}
但是代码没有到达这个地方...有什么建议可以让它工作吗? 谢谢
您对 &&
的使用意味着您希望同时执行这两种方法。但他们当然不是。第一个或第二个匹配,它们是两个不同的连接点,因此将切入点与 &&
组合永远不会触发您的建议方法。您需要使用 ||
来匹配任何一个。
查看您的源代码,您可能想要的是在从 foo
中调用 boo
时触发建议,反之亦然。您还试图将上下文从调用方法泄漏到被调用方法中。这称为 虫洞模式 ,另请参阅我的回答:
所以你可能想使用像
这样的切入点execute2(secAnn) && cflow(execute(firstAnn))
对于您的示例,或者如果您遇到第二种方法调用第一种方法的情况,则相反:
cflow(execute2(secAnn)) && execute(firstAnn)