AspectJ Weaver - проблема с шаблоном установки - PullRequest
0 голосов
/ 22 ноября 2011

У меня есть «рабочий» шаблон AspectJ Weaver для сопоставления всех сеттеров внутри определенного типа (Item):

public pointcut setter(Item item) :
    target(item)
    && execution(void Item+.set*(*));

Он работает просто для всех потенциальных установщиков, но также сопоставляет методы с именами, такими как «setup», которые принимают один аргумент.

Так что мое решение сейчас состоит в том, чтобы проверить в методе, который перехватывает все установщики, является ли 4-й символ строчными или нет (на основе thisJoinPoint.getSignature (). GetName ()), и на основании этого не продолжать код.

Но есть ли лучший способ исключить все методы, которые имеют строчный символ после "set"? Насколько я знаю, регулярные выражения не являются частью шаблонов AspectJ, верно?

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

Я не знаю, если это менее уродливо, но вы могли бы ввести аннотацию @NoSetter и использовать ее в другом pointcut noSetter до исключить методы, такие как setup(...), где вы не хотитепримененный аспект:

public pointcut noSetter(Item item) :
target(item)
&& execution(void @NoSetter Item+.*(..));

Измените pointcut setter следующим образом:

public pointcut setter(Item item) :
target(item)
&& execution(void Item+.set*(*))
&& !noSetter();

Я использовал этот подход в ситуации, когда методы сеттера должны были запускать определенное событие.Мы не могли сгенерировать код, и делать это вручную было слишком утомительно и подвержено ошибкам.Кроме того, на некоторых установщиках событие должно было явно не запускаться вообще.

[Вышеприведенный синтаксис не проверен, сейчас у меня нет IDE, чтобы это проверить]

1 голос
/ 23 ноября 2011

Да, но есть и другие способы решения этой проблемы.Если вы просто пытаетесь избежать метода настройки, вы можете добавить &&! Execute (void Item + .setup (*))

. Вы также можете использовать уродливое решение добавления &&! Execute (void Item + .seta* ()) &&! Выполнение (void Item + .setb (*)) &&! Выполнение (void Item + .setc * (*)) и т. Д. ...

Или если выузнать что-то еще о методах, которых вы хотите избежать, вы можете комбинировать добавление pointcuts this () или cflow ().

...