Domanda

Sono stato con AspectJ per un po 'e funziona benissimo sui campi oggetto scope contenenti annotazioni. Ho appena incontrato una situazione in cui voglio annotare una variabile di metodo di portata che funzionerà con il mio pointcut ma sto avendo difficoltà con esso.

Questa è la pointcut che sto usando. Funziona bene se la mia variabile è un campo per l'oggetto, ma se posso ridurre il campo di applicazione a un metodo (variabile dichiarata all'interno del metodo), allora non funziona più e non so perché. Fatemi sapere cosa posso fare, grazie.

 after(final Trigger trigger): set(@Triggereable * *) && args(trigger)
 {
  System.out.println("trigger flush");
 }

Inoltre, qui è un exmaple di ciò che voglio al lavoro. Che System.out.println sopra dovrebbe fuoco quando il grilletto viene creata un'istanza:

public void foo()
{
   @Triggereable
   private Trigger trigger = new Trigger();
}
È stato utile?

Soluzione

AspectJ attualmente non supporta pointcut sulle variabili locali (leggi la FAQ ).

Mi sembra di ricordare una recente discussione su tale caratteristica un possibilmente aggiunto presto, ma non riuscivo a trovare nel AspectJ issue tracker né nel archivi di mailing list

Altri suggerimenti

Se siete venuti a tale situazione, probabilmente cercando di cambiare applicazione, invece di applicare effettive preoccupazioni trasversali. In sostanza, non è quello che si suppone AOP e AspectJ da utilizzare per.

Come un lavoro in giro, è possibile estrarre la funzionalità rilevanti in un metodo separato e quindi applicare le aspetti a tale metodo o, in alternativa, è possibile sostituire un intero metodo con quella variabile locale, con intorno un consiglio.

Più sopra, nel vostro esempio particolare, il pointcut può essere applicato alla esecuzione costruttore nel campo di applicazione di un determinato metodo, in modo da poter fare praticamente la stessa cosa senza legarsi a una variabile locale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top