pointcut для унаследованных методов

1

Как я могу сопоставить все методы, доступные для определенного класса?

Например, у меня есть следующий класс hierarachy

      A
    / | \
   B  C  D
  /   |   \
 E    F    I
      |
      T

Мне нужно сопоставить все методы, доступные в T, поэтому это методы, определенные в самом T, а также унаследованные методы из классов A, C, F

Я пришел к следующему pointcut, но не совсем доволен этим, потому что он соответствует многим другим классам, не связанным с T:

execution(* A+.*(..)) && this(T) 

Как я понимаю, с такой pointcut aspectj будет изменять каждый метод, определенный в классах A, B, C, D, E, F, I, T Я бы не хотел влиять на классы из семьи T Было бы идеально, если бы затронуло только T (унаследованные методы переопределены кодом aspectj). Существует множество классов, и я хочу свести к минимуму воздействие на остальную систему, то есть мне нужно изменить поведение только класса T и не хочу, чтобы эти изменения влияли на другие классы.

Я мог бы переписать pointcut следующим образом: (execution(* A.*(..)) || execution(* C.*(..)) ||... <all parent classes>) && this(T). Но это заставляет меня убедиться, что иерархия правильная и обновляет ее всякий раз, когда меняется фактическая иерархия.

Благодарю.

  • 0
    почему вы не пытаетесь такое подумать p (T как t): (выполнение T. * (..)) && this (t); или ты пробовал?
Теги:
aop
aspectj

1 ответ

2
Лучший ответ

Ваше предположение неверно, я просто попробовал и исследовал байтовый код. Совет будет только вплетен в A, C, F, T, потому что this() можно определить статически во время компиляции.

Обновление: я забыл упомянуть, что ваш pointcut соответствует только методам, полученным из A и его подклассов. Если вы, как вы говорите в заголовке, действительно хотите сопоставить все унаследованные методы, используйте execution(* *(..)) && this(T).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню