2010-02-09 57 views
1

這是我的第一個問題,所以請溫和。 :-)我知道AspectJ可以在java 的靜態構造器上創建切入點。但問題是,無論是靜態初始化一個方面,如下,可以保證被調用一次:是否確保爲AspectJ方面調用靜態初始化器?

@Aspect 
public class MyAspect { 
    private static Map configuration; 
    static { 
    // Some initialization stuff 
    configuration = Config.getConfiguration(); 
    } 
    ... use the "configuration" map in pointcuts and advices 
} 

換句話說,就是像裝一個Java類的方面是裝的?這是通過ClassLoader完成的嗎?我猜是的 - 它似乎工作 - 但我正在尋找這些方面的保證。

+1

根據對aspectj-users郵件列表的回覆,Ramnivas Laddad(AspectJ In Action的優秀書籍的作者)說,方面中的靜態初始值設定項就像調用類一樣。 – fool4jesus 2010-03-08 14:57:09

回答

1

AspectJ使用字節碼修改工作。此修改可能會在編譯時(「編譯時編織」或CTW)或加載時(「加載時編織」或LTW)發生。

如果您想確定,那麼我建議您使用aspectj編譯器對您的示例執行CTW,然後通過javap工具(或類似的東西)傳遞生成的類文件以查看它實際生成的內容。這應該讓你放心,它是(或不是)做你認爲它做的事。

+0

謝謝 - 我知道一個方面目前實現的很像一個類。但是我看到的文檔很費力地說,方面是*不是*類,所以我一直在尋找一個權威性的聲明,說它會一直以這種方式繼續工作,而不僅僅是它現在所做的。像「一個AspectJ方面與Java類具有相同的生命週期」。 – fool4jesus 2010-02-09 10:04:31