Pointcut и Joint points
Где мы можем подсоединиться?
-
Выполнение определенного метода:
execution(void Point.setX(int))
-
Вызов метода:
call(void Point.setX(int))
-
Выполнение обработчика прерывания:
handler(ArrayOutOfBoundsException)
-
Текущий объект принадлежит типу SomeType:
this(SomeType)
-
Целевой объект принадлежит типу SomeType:
target(SomeType)
-
Выполняемый код принадлежит классу MyClass:
within(MyClass)
-
Выполняемый код по стеку вызовов внутри метода:
withincode(* MyClass.hello(..))
-
Означает, что мы уже вошли внутрь метода, то есть параметры уже передались в метод. Параметры уже находятся в стеке.
-
Значит, что в метод еще не вошли. Мы находимся в классе который будет вызывать метод. Параметры еще не передались.
-
Вызвался метод, а метод выполнил exception.
-
This – это текущий объект. Применяем, например, при вызове методов через интерфейса. Когда нахожусь внутри какого-то объекта.
-
Target – это целевой объект.
-
Значит, что текущий код находится внутри какого-то класса. Проверить, что какой-то другой aspect выполняется в классе.
Если есть иерархия классов, а я хочу остановиться именно на этом.
-
Есть один метод, он вызвал второй и вот этот второй может быть вызван из разных мест. Из этого, этого, этого… и когда
я хочу прицепиться именно к тому первому методу, например.
Использование мета-символов
execution (* *(..))
// первая * - public или private, если *, значит все. Вторая *- название метода (..) – параметры, если .. то значит без разницы какие параметры
call (* set(..))
Выбор элементов в зависимости от типов
execution (int *()) // возвращаемое значение
call (* setY(long))
call (* Point.setY(int))
call (*.new(int, int)) // цепляюсь на конструктор (действие перед-после конструктора итд)
call ( (@Cache) * *(..) ) // зацепка на аннотации
Соединение pointcuts
target (Point) && call (int *()) // цепляется на все вызовы, которые возвращают int и если эти вызовы адресованы к Point
call (* *(..)) && (within (Line) || within (Point))
within (*) && execution (*.new(int))
!this (Point) && call (int *(..)) // прицепились на все вызовы методов, которые возвращают int, лишь бы вызовы не шли из класса Point
Использование области видимости методов
call (public * *(..))
execution (!static * *(..))
execution (public !static * *(..)) // все (public) кроме (!static)