java - 如何将两种不同的注释方法组合成一个切入点?
问题描述
我想注释 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
}
}
但是代码没有到达这个地方......有什么建议可以让它工作吗?谢谢
解决方案
您的使用&&
意味着您希望两种方法同时执行。但当然不是。第一个或第二个匹配,它们是两个不同的连接点,因此将切入点组合在一起&&
永远不会使您的建议方法触发。您需要使用||
来匹配其中任何一个。
查看您的源代码,您可能想要的是在boo
从内部调用时触发建议,foo
也可能反过来。您还试图将上下文从调用方法引入被调用方法。这称为虫洞模式,另请参阅我的答案:
- https://stackoverflow.com/a/12130175/1082681
- https://stackoverflow.com/a/50577287/1082681
- https://stackoverflow.com/a/25075051/1082681
所以可能你想使用一个切入点
execute2(secAnn) && cflow(execute(firstAnn))
对于您的示例,或者如果您遇到第二种方法调用第一种方法的情况,则相反:
cflow(execute2(secAnn)) && execute(firstAnn)
推荐阅读
- oracle - 安装 Oracle Jdeveloper 12C 后找不到 jdev.conf
- vb6 - 如何从 VB6 生成堆损坏
- python - 如何为 Python 列表中的变量赋值?
- python-3.x - 使用 pip 安装库得到“连接超时”
- java - 用于发送带有附件的电子邮件的脚本 - 找不到文件源
- java - 循环后没有得到任何结果,几乎完成
- javascript - 使用 JavaScript 对多个数组进行代码优化
- javascript - 通过 javascript 加载内容时 CPU 使用率高
- basic - ^^ 基本邮票中的二元运算符
- java - 如何使用方法定义字符串数组?