2010-07-23 2 views
2

더 나은 AOP를 수행하기 위해 로컬 변수 주석을 사용하고 싶습니다. 한 가지 아이디어는 주석을 사용하여 프록시를 사용하여 Future <T> 개념을 구현하는 것입니다.로컬 변수 주석이있는 AOP

@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를 아프게하고 로컬 변수 주석으로 수행 할 작업을 얻을 수 있습니까? 나는 다른 스레드가 자바가 실제로 그들을 지원하지 않는다고 지적했지만 그것은 마술적일 것이다. 나는 미래를 돌면서 캡슐화를 중단하고 싶지 않습니다.

답변

2

프록시에서는이 작업을 수행 할 수 없지만 로컬 변수 대신 유형에 주석을 추가하면 실제 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"); 
    } 

} 

및 형태 :

이클립스에서 AspectJ를/자바 응용 프로그램으로 실행할 때다음

이 HeavyLifter의 출력입니다 : 솔루션에 대해 생각하면

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

, 나는 단순히 @nonblocking의 인라인 할당을하는 것보다 아마도 더 나은 실현이해야하기 때문에 그 물건이 "무거운"것을 아는 것은 본질적이다. 그래서 나는 당분간 만족합니다 ... 고마워요! –