AspectJ
AspectJ є аспектно-орієнтованим розширенням, створеним в Xerox PARC для програмування мовою Java. Воно доступне в проєкті Eclipse Foundation з відкритим кодом, як окремо, так і інтегроване з Eclipse. AspectJ стала широко використовуватися де-факто як стандарт для АОП, підкреслюючи простоту і зручність використання для кінцевих користувачів. Вона використовує Java-подібний синтаксис і включає IDE інтеграції для відображення наскрізних структур з моменту її початкового публічного випуску в 2001 році.
Опис мови
Основні можливості
Всі діючі програми Java є діючими програмами AspectJ, але AspectJ також дозволяє програмістам визначити спеціальні конструкції, так звані аспекти. Аспекти можуть містити декілька особливостей не притаманних стандартним класам:
- міжтипові оголошення (англ. inter-type declarations) — дозволяють додавати методи, поля, або інтерфейси для існуючих класів всередині аспекта;
- розріз (англ. pointcut) — дозволяє програмісту вказати точки з'єднання (чітко визначені моменти у виконанні програми, як виклик методу, доступ до змінних). Всі розрізи є виразами для визначення точки перетину.Наприклад, цей розріз відповідає за виконання будь-якого методу в об'єкті типу
Point
, чиє ім'я починається зset
:
pointcut set() : execution(* set*(..) ) && this(Point);
- порада (англ. advice) — дозволяє програмісту вказати код для запуску в точці перетину (англ. joinpoint). Дії можуть бути виконані до, після або навколо зазначеної точки перетину. Тут порада оновлює дисплей кожного разу, коли щось встановлено на
Point
, використовуючи розріз, оголошений вище:
after () : set() {
Display.update();
}
Приклад визначення аспекту на мові AspectJ
aspect Logging {
// аспект, який представляє поведінку реєстрації
pointcut AnyCall (): // назва зрізу
call (void MyClass. * (..));
before (): AnyCall () {
System.out.println
("Hello" + thisJoinPoint)
}
after (): AnyCall () {
System.out.println
("Bye" + thisJoinPoint)
}
}
}
Даний аспект вводить функціональність для протоколювання в клас MyClass
. Перед кожним викликом кожного методу M він виконує пораду, яка виводить повідомлення виду: Hello M, - а після кожного виклику M - пораду, яка виводить аналогічне завершальне повідомлення: Bye M.
В реалізаціях порад використаний об'єкт thisJoinPoint
, який пов'язує пораду з точкою приєднання в цільовій програмі і надає різноманітні можливості для обробки контексту точки приєднання. У прикладі використана лише найпростіша з них - неявний виклик методу thisJoinPoint.toString ()
, який повертає фактичне ім'я цільового методу, знайденого за допомогою розрізу. Розрізи можуть бути також параметризовані, приватні та абстрактні.
Інтеграція з середовищем розробки [1]
Вихідний код | Компілятор | Контроль | Компонування | Розгортання | Виконання |
---|---|---|---|---|---|
Розширені формати .java або .aj | Інкрементний компілятор аспектів | Повний статичний контроль | Під час компіляції і завантаження; формується байт-к од | Статичне розгортання | Проста java-програма |
Підтримка IDE, бібліотеки і документація [1]
IDE | Редактор | Вікна перегляду | Відлагоджувач | Інше | Бібліотеки | Документація |
---|---|---|---|---|---|---|
eclipse
jdeveloper jbuilder netbeans |
Підсвічування синтаксису,
контекстна підказка, посилання на поради |
Загальний вигляд,
візуалізатор, перехресні посилання |
Звичайний java-відлаголжувач | ajdoc,
ajbrowser |
Відсутні | Є багато документації |
Основні компоненти архітектури системи AspectJ [2]
- ajc — компілятор AspectJ. Він компілює вихідний код на мові AspectJ (мові Java, розширеному засобами АОП) в Java-байткод, «зрозумілий» звичайній віртуальній машині Java (JVM, запускаємо командою java). Компілятор ajc доступний як в командному режимі, з великим набором опцій, так і через інтегроване середовище;
- ajdoc — утиліта, аналогічна утиліті javadoc з JDK, яка генерує гіпертекстову HMTL-документацію в стилі javadoc по вихідному коді аспектно-орієнтованої програми, написаної на мові AspectJ. Документація містить опис структури наскрізних функціональностей, використаних в програмі;
- ajbrowser — браузер AspectJ, графічний користувацький інтерфейс для візуалізації аспектів, їх взаємозв'язків і структури наскрізних функціональностей в програмі. Браузер AspectJ дозволяє викликати компілятор ajc для компіляції програм на AspectJ. Проте в браузері AspectJ відсутня функціональність для вибору або скасування вибору точок приєднання аспектів;
- AspectJ ant tasks — інструмент підтримки процесу складання програм для популярного інструменту збірки програм на Java - Apache ant, аналога утиліти make;
- AspectJ load-time weaver — впроваджувальний завантажувач класів, утиліта, що виконує «відкладене» впровадження аспектів при загрузці в JVM відповідного класу. Можлива розробка і додавання в систему впровадження агентів часу завантаження (load-time weaving agents), які вирішують ту ж задачу. AspectJ також підтримує впровадження під час компіляції (яке виконується після того, як компілятор ajc транслює одиницю компіляції AspectJ) і впровадження після компіляції (при якому як вхідна інформація для впровадження аспектів використовуються готовий бінарний клас-файл або jar-архів).
Примітки
- https://www.ibm.com/developerworks/ru/library/j-aopwork2/
- Архівована копія. Архів оригіналу за 16 березня 2015. Процитовано 10 грудня 2014.