Как объединить 2 разных аннотированных метода в pointcut? - PullRequest
0 голосов
/ 17 апреля 2019

Я хочу аннотировать 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
    }
}

Но код не доходит до этого места ... Любое предложениечтобы это сработало, пожалуйста?спасибо

1 Ответ

0 голосов
/ 19 апреля 2019

Использование && подразумевает, что вы ожидаете, что оба метода будут выполняться одновременно. Но, конечно, это не так. Либо первое, либо второе совпадают, они являются двумя разными точками соединения, поэтому комбинирование точек с && никогда не вызовет срабатывания вашего метода совета. Вам нужно использовать || вместо того, чтобы соответствовать любому.

Глядя на свой исходный код, вы, вероятно, захотите вызвать совет, когда boo вызывается изнутри foo и, возможно, также наоборот. Вы также пытаетесь стереть контекст из вызывающего метода в вызываемый метод. Это называется червоточина , см. Также мои ответы здесь:

Так что, вероятно, вы хотите использовать pointcut, как

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

для вашего примера или наоборот, если у вас есть случаи, когда второй метод вызывает первый:

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