AspectJ - Статическое объявление между типами в классах, реализующих данный интерфейс

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

В моем случае у меня есть пустой интерфейс:

public interface Delegate {}

и два класса, реализующие это:

public class DelegateA implements Delegate {...}
public class DelegateB implements Delegate {...}

И я хочу, чтобы аспект объявлял статический член в DelegateA и DelegateB... и всех будущих классах, которые будут реализовывать мой интерфейс!

Как я должен это делать? Если это возможно только...

1 ответ

Решение

Вы уверены, что хотите это сделать? В любом случае, вот мое лучшее решение для вашей проблемы:

public aspect MyAspect pertypewithin(Delegate+){
    public int oneFieldPerClass;
}

Это создаст экземпляр аспекта для каждого подтипа Delegate. Вы можете получить доступ к полю следующими способами:

MyAspect.aspectOf(DelegateA.class).oneFieldPerClass = 1;
MyAspect.aspectOf(DelegateB.class).oneFieldPerClass = 2;

Delegate d = new DelegateA(); 
MyAspect.aspectOf(d.getClass()).onFieldPerClass = 3;

Следующая ветка также может быть полезна:

AspectJ - Создание глобального поля Logger с использованием объявления между типами

HTH, дсп

Другие вопросы по тегам