Специально для любителей музыкальных инструментов, теоретиков, ценителей лучшего, а также простых ребят, которые хотят чему-то научиться.
В поддержку новой инициативы - мега склад примеров на github
Создаем примеры по автоматизации вместе, просто присылайте pull requrest
А также инициативы создания at.info code recipes
В продолжение темы организации перехвата методов при помощи рефлексии, не поленился отклониться от привычных мне концепций и залезть в дебри AOP. Собственно код, приведенный ниже, является полным аналогом, посему сильно углубляться я не стану.
Для себя отметил следующие плюсы:
- красиво
- наглядно
- интересно в плане получения новых знаний
Минусы:
- Потратил час времени просто на поиски способа запуска без всяких посторонних xml и прочего мусора.
- Потратил еще часа 2 на резолвы эроров и мистические игноры аспектов: к примеру, для новой версии плагина, если не указать complianceLevel, получим странный эрор, не смотря на явное указание сорса / таргета.
- Потратил еще пару часов на то, чтобы припилить аспекты в мультимодульное иерархическое мейвен приложение; причем, так и не получилось трекать вызовы конкретного модуля, если сам аспект и кастомная аннотация лежат в другом модуле - нужно еще инвестигейтить; плюс ко всему, aspectj плагин просто игнорится, если его положить в pluginManagement
- Мало толковой документации, зато много бестолковых однотипных примеров с подключением различного мусора, который мне совершенно не нужен для такого простого примера.
- Если в случае мультимодульного приложения рефлекшен дает мне некую универсальность в плане размещения самого компонента трека вызовов методов (скажем внутри фреймворка), то аспекты приходится засовывать внутрь конкретного модуля, ибо не совсем логично ссылаться на пейдж обджектс модуль из аспекта внутри фреймворка - зависимость как раз таки обратная; впрочем, у меня пока это и не получилось сделать. Буду рад пул реквестам с примером для мультимодульного апликейшена.
Вывод: да красиво, да интересно, да удобно. Я считаю себя далеко не глупым человеком, но потраченное время ради такой простой задачи - не стоит тех усилий. К тому же, как заметили наши многоуважаемые критики, если делать упор на новичков, то на разбирательство в AOP у них бы ушло гораздо больше времени, и по каждой из приведенных проблем уже создалось бы десяток доп. тем на форуме. С рефлекшеном разобраться куда проще, да и толковых примеров - пруд пруди.
И все же, что бы я не говорил выше, оба подхода по-своему привлекательны и подойдут для решения конкретных задач. А что уж выбрать - решать вам.
Теперь собственно посмотрим на код:
В pom.xml нужно подключить aspectjrt депенденси, а также aspectj-maven-plugin, с учетом выше приведенных замечаний.
Сам аспект выглядит следующим образом:
При этом, мы не подсовываем проксю, вместо вызова оригинала метода, как в случае с рефлексией. Для вывода более или менее читабельной сигнатуры со входными параметрами, был применен трик с deepToString и replace.
В остальном, код очень похож на предыдущий, за исключением использования testng.xml для запуска теста. Полную реализацию можно посмотреть здесь.
П.С. Опять-таки, для любителей гармошек и критиков-теоретиков: давайте не тратить время на пустые разговоры. Знаете, как сделать лучше, - присылайте пул реквест. Особенно, если реализация займет 15 мин. Не хотите пропускать посредственный (по вашим личным соображениям) код - записывайтесь в админстрацию репозитория и активно проводите ревью.
Пусть таких примеров станет больше, присылайте pull request на наш мега-склад примеров.