Почему я получил предупреждение «совет не был применен»? - PullRequest
6 голосов
/ 04 ноября 2010

Почему следующий код:

 pointcut callsToList() : call(* List.*(..));

 before(List l) : callsToList() && target(l) {
  System.out.println("cool");
 }

генерирует следующее предупреждение:

рекомендация, определенная в org.eclipse.ajdt.examples.ListAdvice, не была применена [Xlint: adviceDidNotMatch]

Я работаю в Eclipse.Я установил eclipse aspectj плагин и, конечно, мой проект - проект aspectj.

Редактировать: Более того, я начал с рабочего примера, предоставленного плагином ajdt:

pointcut callsToBeginTask() : call(void IProgressMonitor.beginTask(..)); 
before() : callsToBeginTask() {
     System.out.println("cool");
};

Я не вижу никакой разницы, кроме того факта, что этот пример работает без предупреждения ...

Ответы [ 2 ]

3 голосов
/ 04 ноября 2010

Если вы хотите, чтобы AspectJ работал в среде OSGi, вы должны использовать аспекты Equinox (т. Е. Equinox Weaving).Это форма ткачества времени загрузки, которая работает с загрузчиками классов osgi.

Этот учебник немного устарел, но его следует начать:

http://www.eclipse.org/equinox/incubator/aspects/equinox-aspects-quick-start.php

Когда все ваши аспекты нацелены на один и тот же проект, вам не нужны аспекты равноденствия.Подойдет регулярное переплетение времени компиляции, но для охвата нескольких пакетов / плагинов это не сработает.

2 голосов
/ 04 ноября 2010

Я предполагаю, что поскольку List является интерфейсом, и вы хотите сопоставлять вызовы всем расширяющимся классам, вам придется использовать следующий синтаксис:

pointcut callsToList() : call(* List+.*(..));

Обновление: ОК, я получил его для работы с этой версией:

pointcut callsToList(List list) :
    call(* java.util.List+.*(..)) && target(list);

Object around(List l) : callsToList(l) {
    // code here
}

Это также работает:

before(List l) : callsToList(l) {
    // code here
}
...