АОП с аннотациями локальных переменных - PullRequest
2 голосов
/ 24 июля 2010

Я хочу использовать аннотации к локальным переменным для улучшения АОП. Одна идея состоит в том, чтобы реализовать концепцию Future с прокси с использованием аннотации.

@NonBlocking ExpensiveObject exp = new ExpensiveObject(); 
//returns immediately, but has threaded out instantiation of the ExpensiveObject.

exp.doStuff(); 
//okay, now it blocks until it's finished instantiating and then executes #doStuff

Могу ли я как-то заболеть AspectJ и получить то, что я хочу, с аннотациями локальных переменных? Я знаю, что другие потоки указали, что Java на самом деле не поддерживает их, но это было бы волшебно. Я действительно не хочу обойти Будущее и нарушить инкапсуляцию.

1 Ответ

2 голосов
/ 18 августа 2010

Вы не можете сделать это с прокси, но реальное переплетение байтовых кодов aspectj поможет вам, если вы аннотируете тип вместо локальной переменной.(Я не думаю, что доступ к локальной переменной поддерживается как pointcut).Во всяком случае, вот код:

Аннотация:

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

Класс, помеченный этой аннотацией:

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

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

Основной класс:

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");
    }

}

и аспект:

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();
    }

}

Вот вывод из HeavyLifter, когда вы запускаете его как AspectJ / Java-приложение из eclipse:

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