2010-11-04 14 views
6

Pourquoi le code suivant:Pourquoi j'ai reçu l'avertissement «Le conseil n'a pas été appliqué»?

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

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

génère l'avertissement suivant:

conseils définis dans org.eclipse.ajdt.examples.ListAdvice n'a pas été appliquée [Xlint: adviceDidNotMatch]

Je travaille avec Eclipse. J'ai installé eclipse aspectj plugin et bien sur mon projet est un projet d'aspectj.

Edit: De plus j'ai commencé à partir d'un exemple de travail fourni par AJDT plugin:

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

Je ne vois aucune différence, sauf le fait que cet exemple fonctionne sans avertissement ...

+0

Peut-être est-ce lié à la politique de chargement des classes Eclipse/OSgi? Comment fonctionne Aspect pour accrocher les pointcoins fournis? –

+0

Pouvez-vous montrer le code qui devrait être tissé par le conseil? – Espen

+0

Vous n'êtes pas sûr de comprendre votre demande. Je veux que ce conseil soit appelé dans une application Eclipse exécutant plusieurs plugins personnalisés. Ainsi, le code que je veux "analyser" est divisé entre de nombreux plugins/packages/classes. –

Répondre

3

Lorsque vous voulez AspectJ travailler dans un environnement OSGi, vous devez utiliser les aspects Equinox (alias Equinox tissage). C'est une forme de tissage de temps de chargement qui fonctionne avec les chargeurs de classe osgi.

Ce tutoriel est un peu obsolète, mais devrait vous aider à démarrer:

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

Lorsque vos aspects sont tous ciblés dans le même projet, vous n'avez pas besoin aspects Equinox. Le tissage régulier de temps de compilation fera l'affaire, mais pour couvrir plusieurs paquets/plugins, cela ne fonctionnera pas.

2

Je pense est que parce que la liste est une interface et que vous voulez faire correspondre les appels à toutes les classes étendant vous devez utiliser cette syntaxe:

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

Mise à jour: OK, je l'ai eu à travailler avec cette Version:

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

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

Cela fonctionne aussi:

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

Votre réponse ne résout pas mon problème. De plus, j'ai commencé à partir d'un exemple de travail fourni par ajdt plugin: \t pointcut callsToBeginTask(): call (void IProgressMonitor.beginTask (..)); \t \t before(): callsToBeginTask() {}; –

+0

Cet exemple ne génère aucun avertissement même si IProgressMonitor est une interface. –

+0

voir ma réponse mise à jour, cela fonctionne pour moi. à propos des choses progressmonitor: s'il vous plaît mettez cela dans votre question (ou une question distincte) si vous voulez qu'il réponde. –