AspectJ: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Riga 39:
execution(void faiqualcosa(int))
 
La differenza tra un join point di tipo execution e uno di tipo call è molto semplice: un join point di tipo call corrisponde alla chiamata di un metodo da parte di un altro metodo, mentre un join point di tipo execution corrisponde all' esecuzione del corpo del metodo. Normalmente un join poit di tipo call è pressoché equivalente a un join point di tipo execution; a volte però non è così. Prendiamo ad esempio il caso della classe contenente il metodo main: in java, per convenzione, ogni programma deve comprendere una classe che implementi un metodo che abbia la seguente firma: public static void main(String[] args). Tale metodo è il primo ad essere eseguito dalla java VM . Un join point definito come call (public static void main(String[] args)) non verrà mai raggiunto durante l'esecuzione di un programma java , a differenza del join point definito da execution (public static void main(String[] args)). Questo accade perché , anche se il metodo main verrà sicuramente eseguito, esso non viene mai chiamato da un altro metodo, in quanto sarà sempre il primo metodo ad essere eseguito .
Esistono inoltre molti altri modi per individuare dei join point nel flusso del programma :
 
Riga 50:
set (byte B.valore )
 
sono dei join point che denotano, rispettivamente, la lettura dell'attributo di tipo intero 'numero di un oggetto appartenente alla classe A e la scrittura di un attributo di tipo byte 'valore' di un oggetto appartenente alla classe B . Un join point di tipo initialization(), invece, corrisponde alla creazione di un oggetto .
 
initialization(B.new())
 
corrisponde alla creazione di un oggetto di classe B tramite un costruttore che non accetta parametri, mentre, ad esempio ,
 
initialization(C.new(String,int))
 
corrisponde alla creazione di un oggetto di classe C tramite un costruttore che ha come parametri una stringa e un intero .
Un altro tipo di join point definito da aspectj è il join corrispondente all?'esecuzione del corpo di un qualsiasi advice .
Tale join point si scrive come
 
adviceexecution()
 
Ci sono anche altri tipi di join point in aspectj, ma visto che il linguaggio è ancora in evoluzione, qui ci si è limitati a descrivere solo quelli più? frequentemente usati, che probabilmente saranno presenti anche nelle future versioni di aspectj, successive alla versione 1.1 cui l'autore fa riferimento .
In aspectj esistono inoltre delle espressioni che permettono di definire degli insiemi di join point;
l' espressione
 
call(void conta(..))
 
corrisponde alla chiamata di un qualsiasi metodo che abbia nome 'conta' e che non restituisca un valore ; definisce cioè un insieme i cui membri sono i join point corrispondenti alla chiamata di metodi void che differiscono tra loro solo per il numero e il tipo degli argomenti .
L'espressione
 
call(public * doSomething(..))
 
definisce invece un insieme di join point corrispondenti alla chiamata dei metodi di nome doSomething che siano stati dichiarati come pubblici, che differiscono tra loro per il numero e il tipo degli argomenti; inoltre, i suddetti metodi sono diversi anche per il tipo di dato che ritornano, che può anche essere nullo (esempio: void doSomething(..) ).<br />
Un altro esempio di espressione che codifica una proprietà definente un insieme di join point è il seguente :
doSomething che siano stati dichiarati come pubblici, che differiscono tra loro per il numero e il tipo degli argomenti; inoltre, i suddetti metodi sono diversi anche per il tipo di dato che ritornano, che può anche essere nullo (esempio : void doSomething(..) ) .
Un altro esempio di espressione che codifica una proprietà definente un insieme di join point è
il seguente :
 
call(void A.*(..))