2010-11-04 10 views
6

Warum funktioniert der folgende Code:Warum habe ich die Warnung "Beratung wurde nicht angewendet" erhalten?

hat nicht angewandt worden

Beratung definiert in org.eclipse.ajdt.examples.ListAdvice:

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

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

die folgende Warnung erzeugt [Xlint: adviceDidNotMatch]

Ich arbeite mit in Eclipse. Ich habe eclipse aspectj plugin installiert und natürlich ist mein Projekt ein aspectj Projekt.

Edit: Außerdem habe ich angefangen von einem Arbeitsbeispiel von AJDT Plugin zur Verfügung gestellt:

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

ich keinen Unterschied, außer der Tatsache sehen, dass dieses Beispiel funktioniert ohne Vorwarnung ...

+0

Vielleicht hängt das mit der Eclipse/OSgi Klassenladepolitik zusammen? Wie funktioniert aspectj, um die bereitgestellten Pointcuts zu haken? –

+0

Können Sie den Code anzeigen, der durch den Ratschlag gewebt werden soll? – Espen

+0

Nicht sicher, Ihre Anfrage zu verstehen. Ich möchte, dass dieser Rat in einer Eclipse-Anwendung aufgerufen wird, die mehrere benutzerdefinierte Plugins ausführt. Daher ist der Code, den ich analysieren möchte, auf viele Plugins/Pakete/Klassen verteilt. –

Antwort

3

Wenn Sie AspectJ in einer OSGi-Umgebung arbeiten möchten, Sie Equinox Aspects verwenden müssen (auch bekannt als Equinox Weaving). Dies ist eine Form des Ladezeitwebens, die mit OSGI-Klassenladern arbeitet.

Dieses Tutorial ist ein wenig veraltet, aber sollte Ihnen den Einstieg:

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

Wenn Ihre Aspekte sind alle im selben Projekt gezielt, brauchen Sie nicht Equinox Aspects. Reguläres Kompilierzeitweben reicht, aber um mehrere Bundles/Plugins zu überbrücken, wird dies nicht funktionieren.

2

Meine Vermutung Liste ist, dass da eine Schnittstelle, und Sie möchten Anrufe in alle Verlängerung Klassen entsprechen würden Sie diese Syntax verwenden:

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

Update: OK, ich habe es mit diesem arbeiten Version:

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

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

Dies funktioniert auch:

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

Ihre Antwort löst mein Problem nicht. Außerdem habe ich von einem Arbeitsbeispiel angefangen, das vom ajdt Plugin bereitgestellt wurde: \t pointcut calliesToBeginTask(): call (void IProgressMonitor.beginTask (..)); \t \t before(): callsToBeginTask() {}; –

+0

Dieses Beispiel generiert keine Warnung, selbst wenn IProgressMonitor eine Schnittstelle ist. –

+0

sehe meine aktualisierte Antwort, das funktioniert für mich. über den Fortschrittsmonitor: Bitte stellen Sie das in Ihre Frage (oder eine separate Frage), wenn Sie es beantwortet haben wollen. –