<<
>>

Конструкции статического пересечения

Межтиповое объявление, называемое также введением, является конструкцией статического пересечения, которая изменяет статическую структуру классов, интерфейсов и аспектов программы. К примеру, в класс можно добавить метод или поле или объявить тип для реализации интерфейса.
В этом объявлении один тип (аспект) объявляет структуру других типов (классов, интерфейсов и даже аспектов) — отсюда и название.

Следующий оператор предлагает ткачу назначить интерфейс 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 ";

}

<< | >>

Еще по теме Конструкции статического пересечения:

  1. Глава 16 СИТУАЦИИ ВЗАИМНОГО ВАМПИРИЗМА. СТАТИЧЕСКИЕ КОНФЛИКТЫ
  2. ЛЕКЦИЯ 3 1.2.1. Город как место пересечения (локус интерференции) территориально-поселенческих, социально-общностных и ментальных структур
  3. Общие принципы конструкции депривационной ванны.
  4. ЛЕКЦИЯ 6 1.3.2. Образ города – семантическая конструкция
  5. Понятие коммуникации как методологический принцип построения гносеологической конструкции социокультурного пространства города
  6. § 29 Передача и переход прав по обязательствам. – Римская конструкция права передачи. – Облегчение передачи новейшим законодательством. – Передаточная надпись. – Ограничения передачи. – Действие передачи. – Ответственность передатчика и права приобретателя. – Вступление в право кредитора или суброгация. – Русский закон передачи. – Передача заемных писем. – Переход требований к кредиторам.
  7. VC24 (точка реанимации) - расположена в центре подбородочногубной борозды
  8. VC5 - расположена ниже пупка на 3 цуня.
  9. VC20 - расположена на 0,7 см выше центра яремной выемки.
  10. VC16 - расположена на уровне 5-го межреберья.
  11. VC17 - расположена на уровне четвертого межреберья.
  12. Дуальные пары.
  13. О Божьих испытаниях, которые человечество регулярно не выдерживало
  14. VC3 - расположена ниже пупка на 4 цуня.
  15. VC12 - расположена выше пупка на 4 цуня.
  16. VC8 - "божественная граница", расположена в центре пупка.