Методы сопоставления точек, которые были аннотированы напрямую или в унаследованном интерфейсе? - PullRequest
1 голос
/ 11 сентября 2011

Рассмотрим это @PointCut, которое срабатывает, если метод помечен аннотацией @Secure:

@Pointcut("execution(@Secure * *(..)) && @annotation(secure)")
public void accessOperation(final Access access) { }

Это прекрасно работает для таких методов, как:

class Foo {
    @Secure
    public void secureMethod() { }
}

Новозможно ли иметь Pointcut, который также запускается, когда аннотация существует только в суперклассе / интерфейсе, подобном этому?

interface Foo {

    @Secure
    public void secureMethod();
}

class SubFoo implements Foo {

    @Override
    public void secureMethod() {  // <--- execution of this method should be caught
        /* .... */
    }
}

РЕДАКТИРОВАТЬ:

Это, кажется, очень тесно связаноto: @ AspectJ pointcut для подклассов класса с аннотацией

Единственное отличие состоит в том, что они используют аннотацию на уровне класса, тогда как мне нужна аннотация на уровне метода.

Ответы [ 2 ]

1 голос
/ 11 сентября 2011

Я не знаю, как AspectJ работает с аннотациями в таком сценарии, но если он проверяет только класс реализации на наличие определенной аннотации, и эта аннотация обнаруживается только в интерфейсе, который реализует класс, Java сообщит об этом эта аннотация отсутствует в методе класса. Вы должны аннотировать аннотацию с помощью @Inherited:

http://download.oracle.com/javase/6/docs/api/java/lang/annotation/Inherited.html

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

0 голосов
/ 12 сентября 2011
I don't actually know the classes in my aspect 

Учитывая то, что вы говорите, и тот факт, что @Inherited не может быть использован ни для чего иного, кроме классов, вы неявно надеетесь, что AspectJ выполнит работу по выяснению, является ли метод (или его переопределенные реализации)и декларации) аннотируется.Это намного больше, чем заявлено AspectJ.

Если вашей конечной целью является защита некоторого кода, то все методы, которые должны быть защищены, должны быть должным образом аннотированы в первую очередь.Таким образом, ответ на ваш вопрос - нет, это невозможно в этом контексте, особенно если вы ничего не знаете о классах.

Однако может возникнуть обходной путь, если у вас есть доступ к процессору аннотаций.В этом случае вы можете выбрать все аннотации @Secure и пройтись по коду с отражением, чтобы сгенерировать код AspectJ во время компиляции, который бы правильно захватывал все экземпляры метода.Не легко, но возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...