2010-07-23 13 views
2

Je souhaite utiliser des annotations de variables locales pour améliorer l'AOP. Une idée consiste à implémenter le concept < T avec un proxy en utilisant une annotation. Puis-je être malade AspectJ sur ce point et obtenir ce que je veux faire avec les annotations variables locales? Je sais que d'autres threads ont indiqué que Java ne les supporte pas vraiment mais ce serait magique. Je ne veux vraiment pas faire circuler un avenir et briser l'encapsulation.AOP avec annotations de variables locales

Répondre

2

Vous ne pouvez pas le faire avec un proxy, mais le tissage réel de l'aspect du bytecode vous y amènera si vous annotez le type au lieu de la variable locale. (Je ne pense pas que l'accès aux variables locales soit supporté comme un pointcut). Quoi qu'il en soit, voici un code.

Une annotation:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
public @interface Later {} 

Une classe marquée avec cette annotation:

package com.dummy.aspectj; 
@Later 
public class HeavyObject{ 

    public HeavyObject(){ 
     System.out.println("Boy, I am heavy"); 
    } 
} 

Une classe principale:

package com.dummy.aspectj; 
public class HeavyLifter{ 

    public static void main(final String[] args){ 
     final HeavyObject fatman = new HeavyObject(); 
     System.out.println("Finished with main"); 
    } 

} 

et un aspect:

package com.dummy.aspectj; 
public aspect LaterAspect{ 

    pointcut laterInstantiation() : 
     execution(@Later *.new(..)) ; 

    void around() : laterInstantiation() { 
     new Thread(new Runnable(){ 
      @Override 
      public void run(){ 
       System.out.println("Wait... this is too heavy"); 

       try{ 
        Thread.sleep(2000); 
       } catch(final InterruptedException e){ 
        throw new IllegalStateException(e); 
       } 
       System.out.println("OK, now I am up to the task"); 
       proceed(); 
      } 
     }).start(); 
    } 

} 

est ici la sortie avion de transport lorsque vous l'exécutez comme AspectJ/Java Application de l'éclipse:

Finished with main 
Wait... this is too heavy 
OK, now I am up to the task 
Boy, I am heavy 
+0

Après avoir réfléchi à votre solution, je l'ai réalisé est probablement mieux que d'avoir une affectation en ligne de @nonblocking simplement parce qu'il doit être inhérent à l'objet à savoir qui est "lourd". Donc je suis satisfait pour l'instant ... Merci! –