Конструкции статического пересечения
Следующий оператор предлагает ткачу назначить интерфейс AccessTracked родителем класса MessageCommunicato:
declare parents: MessageCommunicator implements AccessTracked;
Когда это объявление будет вплетено, эффект будет равносилен такому объявлению класса MessageCommunicator:
public class MessageCommunicator implements AccessTracked {
}
Другая форма межтипового объявления — введение элемента — предлагает путь добавления новых методов и полей в другие типы. Следующее объявление добавляет поле lastAccessedTime и методы updateLastAccessedTime() и getLastAccessedTime() к типу AccessTracked: private long AccessTracked.lastAccessedTime; public void AccessTracked.updateLastAccessedTime() { lastAccessedTime = System.currentTimeMillis();
}
public long AccessTracked.getLastAccessedTime() { return lastAccessedTime;
}
Далее можно посоветовать методам в типе, который реализует AccessTracked (непосредственно или через оператор declare parents), обновить время последнего доступа, как показано в следующем фрагменте: before(AccessTracked accessTracked) : execution(* AccessTracked+.*(..)) && !execution(* AccessTracked.*(..)) && this(accessTracked){ accessTracked.updateLastAccessedTime(); } |
Этот код советуют всем методам типов, которые реализуют интерфейс AccessTracked (символ подстановки + обозначает подтипы), но не методу в AccessTracked (например, введенному методу updateLastAccessedTime()). Срез this() выделяет трассируемый объект, следовательно, для него можно вызвать метод updateLastAccessedTime(). Теперь разместим все эти фрагменты в аспекте: package ajia.track; import ajia.messaging.MessageCommunicator; public aspect TrackingAspect { declare parents: MessageCommunicator implements AccessTracked; private long AccessTracked.lastAccessedTime; public void AccessTracked.updateLastAccessedTime() { |
Программирование на аспектно-ориентированном языке AspectJ |
519 |
lastAccessedTime = System.currentTimeMillis(); } public long AccessTracked.getLastAccessedTime() { return lastAccessedTime; } before(AccessTracked accessTracked) : execution(* AccessTracked+.*(..)) && !execution(* AccessTracked.*(..)) && this(accessTracked) { accessTracked.updateLastAccessedTime(); } private static interface AccessTracked { } } Следующая форма статического пересечения позволяет в ходе компиляции обнаружить и отметить точки соединения, которые соответствуют срезу. Объявление времени вплетения является еще одной формой конструкции статического пересечения, позволяющей добавлять предупреждения и сообщения об ошибках времени вплетения при обнаружении определенных паттернов использования. Достаточно часто вплетение выполняется в ходе компиляции; поэтому эти предупреждения и сообщения об ошибках выдаются при компиляции классов. Вернемся к аспекту SecurityAspect. Допустим, что следует получать предупреждения о непосредственных вызовах метода Authenticator.authenticate(). Следующее объявление принуждает формировать предупреждения о том, что любая часть программы вызывает запрещенный метод, исключением, конечно, остается аспект SecurityAspect: declare warning : call(void Authenticator.authenticate()) && !within(SecurityAspect) : "Аутентификация должна выполняться только средствами SecurityAspect"; Срез call() выделяет вызов метода, а !within() ограничивает выбор теми точками соединения, которые появляются вне SecurityAspect. При обнаружении заданных условий ткач будет формировать предупреждения. Можно добавить это объявление к аспекту SecurityAspect: package ajia.security; public aspect SecurityAspect { declare warning : call(void Authenticator.authenticate()) && !within(SecurityAspect) : "Аутентификация должна выполняться только средствами SecurityAspect "; }
Еще по теме Конструкции статического пересечения:
-
Windows -
Архитектура компьютера -
Интернет -
Информатика -
Компьютер -
Компьютерные и телекоммуникационные системы -
Программирование -
Социальные сети -
-
Английский язык -
Астрология -
Астрономия -
Биология -
Военная литература -
Журналистика -
Компьютерная инженерия -
Педагогика -
Право -
Психология -
Социология -
Lecture.Center
|