2010-11-04 13 views
6

Perché il seguente codice:Perché ho ricevuto l'avviso "avviso non è stato applicato"?

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

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

genera il seguente avviso:

consiglio definito nel org.eclipse.ajdt.examples.ListAdvice non è stata applicata [Xlint: adviceDidNotMatch]

Sto lavorando con in Eclipse. Ho installato eclipse aspectj plugin e ovviamente il mio progetto è un progetto di aspetto.

Edit: Inoltre ho iniziato da un esempio di lavoro fornito da ajdt plugin:

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

non riesco a vedere alcuna differenza se non il fatto che questo esempio funziona senza preavviso ...

+0

Forse questo è correlato alla politica di caricamento della classe Eclipse/OSgi? Come funziona l'aspettoj al fine di agganciare i pointcuts forniti? –

+0

Puoi mostrare il codice che dovrebbe essere intrecciato dal consiglio? – Espen

+0

Non capisco la tua richiesta. Voglio che questo consiglio venga chiamato in un'applicazione Eclipse con diversi plug-in personalizzati. Quindi il codice che voglio "analizzare" è diviso in molti plugin/pacchetti/classi. –

risposta

3

Quando si desidera AspectJ di lavorare in un ambiente OSGi, è necessario utilizzare Aspetti Equinox (aka Equinox tessitura). Questa è una forma di tessitura del tempo di caricamento che funziona con i classloader di osgi.

Questo tutorial è un po 'fuori moda, ma dovrebbe iniziare:

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

Quando i vostri aspetti sono tutti mirati all'interno dello stesso progetto, non occorre Aspetti Equinox. La normale tessitura a tempo di compilazione andrà bene, ma per estendere più bundle/plug-in, questo non funzionerà.

2

La mia ipotesi è che, poiché List è un'interfaccia e si desidera far corrispondere le chiamate a tutte le classi che si estendono si dovrà utilizzare la seguente sintassi:

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

Update: OK, ho preso a lavorare con questo Versione:

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

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

Questo funziona anche:

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

La tua risposta non risolve il mio problema. Inoltre ho iniziato da un esempio funzionante fornito dal plugin ajdt: \t chiamate pointcutToBeginTask(): call (void IProgressMonitor.beginTask (..)); \t \t before(): callsToBeginTask() {}; –

+0

Questo esempio non genera alcun avviso anche se IProgressMonitor è un'interfaccia. –

+0

vedere la mia risposta aggiornata, questo funziona per me. a proposito della roba del progressmonitor: per favore mettila nella tua domanda (o in una domanda separata) se vuoi che risponda. –

Problemi correlati