靜態橫切是指對已存在的類型定義引入新的方法,屬性等,與動態橫切不同,靜態橫切不改變類型的動態行為,而是改變其靜態結構,也即導入(Introduction)。通過在方面代碼中聲明方法,屬性,需要繼承的超類,接口等,在代碼織入時,可以改變應用此方面的類的定義。
3.2AspectWerkz
AspectWerkz是一個動態的AOP框架,利用對字節碼的修改實現方面的織入,并使用Java虛擬機的動態替換字節碼的能力實現動態AOP的要求。AspectWerkz沒有擴展Java語言,方面、參考、切入點等均使用標準的Java構造塊,即類以及方法來實現,并使用XML文件定義這些構造塊,此外AspectWerkz還支持使用JavaDoc標記實現的運行期屬性定義。AspectWerkz采用了與AspectJ相似的連接點模型,只是支持的連接點種類少于AspectJ,參考的類型一致。
AspectWerkz通過引入一個間接層,方面容器(AspectContainer)以及對字節碼的轉化,即代碼織入實現動態AOP的要求,方面容器管理部署好的類、方面代碼,并根據XML文件或JavaDoc注釋中定義的方面,參考,切入點等得到連接點處相關的方面信息,并在程序的執行中控制執行流程,在匹配的連接點處執行適當的參考。
AspectWerkz通過類載入層次的適當位置攔截類載入從而實現字節碼的修飾。AspectWerkz提供了兩種織入模式實現AOP:靜態織入以及動態織入。靜態織入只在類載入時對字節碼作一次性的轉化,通過將類的方法實現移入AspectWerkz命名的方法中,將原方法中的代碼改寫,由方面容器調用適當的參考,并調用前述AspectWerkz添加的方法從而完成代碼的織入。導入則由混合類型(Mixin)實現,用于為類增加新的方法,混合類型是一種使用接口與實現類的方式模擬多重繼承的機制。AspectWerkz通過修改字節碼使被導入的類實現混合類型的接口,并在接口定義的方法中,將控制交給容器管理器,由它來完成對實現的調用。靜態織入可以在運行時動態的為切入點增加,刪除參考,可以引入新的參考,但是無法定義新的切入點,這需要動態織入。動態織入由兩階段織入完成,分別為類載入階段與激活階段。首先,在類載入時,按照靜態織入的方法,為需要實現動態織入的類的每個方法添加一個相應的空的方法,匹配連接點的方法除外。然后,在激活階段,原方法體中的代碼將被交換到類載入時新產生的方法中,原方法將實現靜態織入時相同的處理,從而方面容器控制流程。前述代碼交換是由熱交換(HotSwap)實現的,這是JVM提供的API。通過方面容器與織入模型,AspectWerkz提供了動態AOP的實現。