2011-12-30 6 views
7

È possibile determinare quali aspetti si agganciano ad una data classe e accedere alle loro istanze?Determinare quali aspetti si agganciano ad una data classe

Qualcosa di simile:

Foo foo = new Foo(); 
List<Object> aspects = getAllAspectsOf(foo); 
+0

Non sono sicuro di cosa stai cercando di ottenere. Per prima cosa, cosa significa essere un aspetto di foo? Forse intendi che quando viene eseguito un consiglio, "foo" sarà associato al collegamento "this"(). Poiché i pointcuts possono essere associati dinamicamente, qualsiasi metodo getAllAspectsOf (foo) dipende dal thread e da cosa è cflow. Penso che dovresti considerare l'uso di perthis o pertarget. Quindi per una determinata istanza di Foo, puoi chiamare MyAspect.aspectOf (foo). Vedi http://eclipse.org/aspectj/doc/released/progguide/semantics-aspects.html#aspect-stantening –

risposta

2

In primo luogo, molto probabilmente non si sarebbe in grado di eseguire tali controlli utilizzando le API Aspect esistenti, perché i wrapper Aspect che intercettano le chiamate con lo scopo specifico di NON essere collegati a un particolare componente, quindi non ci sarebbe alcun modo naturale per rilevare gli aspetti intercettanti.

Detto questo - ci potrebbe essere un modo si potrebbe avvolgere aspetti all'interno di una sorta di classe strategia, tuttavia, la quantità di lavoro per mantenere questo sarebbe abbastanza significativo.

http://www.eclipse.org/aspectj/doc/released/faq.php#q:benefits

aspetti sono spesso descritti come "essere in cima" o il tempo "tessuto con" il vostro altro codice, vale a dire in fase di esecuzione o costruire.

http://asm.ow2.org/users.html

Così, il codice non sarebbe tipicamente "a conoscenza" di tali caratteristiche Aspect Oriented, dato questo paradigma per l'attuazione degli aspetti.

Tuttavia, se si voleva aspetti tracciabili, è possibile implementare qualche aspetto "come" caratteristiche usando java standard ed iniezione di dipendenza - cioè, caricando iniettato moduli a runtime che implementano alcuna funzionalità trasversale che un l'aspetto dovrebbe essere implementato ... ma, sospetto, se si sta davvero facendo un serio codice orientato all'aspetto, un tale approccio potrebbe non essere all'altezza dei requisiti relativi all'aspetto.

2

Non credo che si può, anche se, sarebbe la tecnologia dipendente. Per quanto ne so, non c'è modo con aspectj o cglib di tracciare e accedere al consiglio tessuto attorno a una classe. Puoi creare il tuo consiglio in modo tale da aggiungere un riferimento a se stesso ad una struttura locale di thread a cui è possibile accedere dalla classe consigliata. Tuttavia, sembrerebbe sconfiggere lo scopo degli aspetti come una soluzione alle preoccupazioni trasversali se accoppi le tue classi target a loro.

+0

Non ho intenzione di accoppiare la classe target all'aspetto. Invece, voglio fornire una classe di strategia con la classe target e la classe di strategia deve quindi accedere all'aspetto definito sulla classe di destinazione per registrare un listener. La classe target non è modificata ... solo la classe di strategia ha conoscenza dell'aspetto. – mibollma

+0

@mibollma: Potresti avere il consiglio di registrare l'ascoltatore, evitandoti di dover fornire la strategia all'istanza di destinazione? – philwb

0

Immagino che per ottenere alcune informazioni limitate sia necessario modificare il tessitore in modo da salvare qualche registro del suo lavoro nella classe aumentata, in modo da poterlo leggere in un secondo momento. Ma non aspettatevi molto - gli aspetti di AFAIK potrebbero non esistere come nessun tipo di runtime. Mi chiedo - c'è qualche quadro che lo faccia?

Problemi correlati