2010-11-04 3 views
6

Почему следующий код:Почему я не получил предупреждение «совет не был»?

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

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

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

совет, определенный в org.eclipse.ajdt.examples.ListAdvice не применяется [Xlint: adviceDidNotMatch]

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

Edit: Кроме того, я начал с рабочим примером, приведенным на AJDT плагина:

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

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

+0

Возможно, это связано с политикой загрузки классов Eclipse/OSgi? Как работает аспект, чтобы подключить предоставленные точки pointcut? –

+0

Можете ли вы показать код, который следует переплетать по совету? – Espen

+0

Не забудьте понять ваш запрос. Я хочу, чтобы этот совет вызывался в приложении Eclipse с несколькими пользовательскими плагинами. Таким образом, код, который я хочу «анализировать», разбит на многие плагины/пакеты/классы. –

ответ

3

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

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

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

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

2

Моей догадки является то, что, поскольку список представляет собой интерфейс, и вы хотите, чтобы соответствовать вызовам на все проходящие классы вы должны использовать этот синтаксис:

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 
} 
+0

Ваш ответ не решает мою проблему. Более того, я начал с рабочего примера, предоставленного плагином ajdt: \t pointcut callsToBeginTask(): call (void IProgressMonitor.beginTask (..)); \t \t before(): callsToBeginTask() {}; –

+0

Этот пример не генерирует никаких предупреждений, даже если IProgressMonitor является интерфейсом. –

+0

см. Мой обновленный ответ, это работает для меня. о материале progressmonitor: пожалуйста, поместите это в свой вопрос (или отдельный вопрос), если вы хотите, чтобы он ответил. –