Исполнение Vs. вызвать точку соединения

У меня есть два разных класса аспект, чтобы подсчитать количество вызовов нестатического метода для выполнения тестовой программы. Первый аспект подсчитывает методы для точек вызова "вызов":

pointcut methodCalls() : call (!static * test..*(..));
before(): methodCalls() {
        counter.methodCallCounter();
}

в то время как второй аспект подсчитывает методы для точек выполнения "выполнения":

pointcut methodCalls() : execution (!static * test..*(..));
before(): methodCalls() {
        counter.methodCallCounter();
}

methodCallCounter() - это статический метод в классе счетчиков.

Количество вызовов метода для небольшой тестовой программы одинаково. Но когда я меняю тестовую программу на более крупную программу, количество вызовов методов во втором классе аспектов (с помощью pointcut point) больше, чем количество вызовов методов в классе аспект с помощью pointcutcut. Это разумно, так как точка соединения вызова не выбирает вызовы, сделанные супер, и поэтому не учитывает их.

Однако я столкнулся с ситуацией, когда для конкретного выполнения программы число вызовов нестатического метода в классе аспект с "pointcutcut" было выше, чем количество вызовов метода в классе аспект с "pointcut point". Я не могу найти никакой интерпретации, почему это происходит. Любая мысль о причине второй ситуации оценивается.

Ответ 1

По сути, объяснение довольно просто, если вы понимаете основную разницу между точками point call() и execution(): если первый перехватывает всех вызывающих абонентов (т.е. источники вызовов методов), последний перехватывает сами вызовы независимо от того, где они происходят от.

Так как же количество перехватов, вызванных обеими пунктами, отличается?

  • Если вы вызываете JRE/JDK-методы из своего собственного кода, AspectJ может переплетаться в ваши вызовы, но не в точки подключения к исполнению в JDK (если вы не создали тканый JDK в качестве подготовительного шага). Таким образом, количество вызовов будет больше, чем количество исполнений.
  • Аналогично, если вы вызываете методы в сторонних библиотеках, которые вы не соткали с AspectJ, потому что они не были на пути в пути во время LTW или CTW, снова выполнение не будет выполнено.
  • Наконец, но не в последнюю очередь, это может произойти наоборот, если ваш собственный тканый код вызывается сторонними библиотеками или классами JRE/JDK. В этом случае подсчитанное количество исполнений будет больше, чем количество вызовов, потому что они происходят из мест вне контроля вашего кода AspectJ.

Как правило, во всех случаях причиной является различие между общим используемым кодом и подмножеством сплетенного кода. Другими словами: разница между кодом под и вне вашего контроля (или аспектов).