傳統 AOP 實作多基於位元碼檢測,雖成熟但存在固有缺陷:啟動開銷大、無法攔截反射呼叫與欄位存取、運行時動態增減通知困難、記憶體額外佔用。JRockit 團隊觀察到 JVM 本身已具備類別載入解析、方法調度與內聯編譯等核心能力,若在 JVM 內部直接編織通知,可根本解決上述問題。
此方案優於 JVMTI/JVMDI 等 C 層級事件機制:後者需處理複雜 C API、缺乏細粒度連接點匹配、預設開啟所有事件導致效能損耗。
為避免綁定特定 AOP 框架語意,JRockit 提供通用的「動作調度與訂閱」Java API,核心構件:
WeaverFactory.getWeaver() 取得,依呼叫者類別載入器隔離權限。@CalleeMethod、@CallerMethod、@This、@Target、@Args,宣告式指定動作方法所需上下文。BEFORE、AFTER_RETURNING、AFTER_THROWING、INSTEAD_OF(對應 around)。import java.lang.reflect.*;
import jrockit.ext.weaving.*;
public class SimpleAction {
public static void simpleStaticAction() {
System.out.println("hello static action!");
}
public void simpleAction() {
System.out.println("hello action!");
}
public void simpleAction(@CalleeMethod WMethod calleeM,
@CallerMethod WMethod callerM) {
System.out.println(callerM.getMethod().getName() + " calling " + calleeM.getMethod().getName());
}
}
WMethod 封裝 Method、Constructor 與靜態初始化器,類似 AspectJ JoinPoint.StaticPart.getSignature()。
import jrockit.ext.weaving.*;
public class InsteadOfAction {
public Object instead(InvocationContext jp, @CalleeMethod Method callee) {
return jp.proceed(); // 繼續執行原方法
}
}
InvocationContext 提供 proceed() 控制攔截鏈流向。
Weaver w = WeaverFactory.getWeaver();
Method staticActionMethod = SimpleAction.class.getDeclaredMethod("simpleStaticAction", new Class[0]);
MethodSubscription ms = new MethodSubscription(/* 切點匹配條件 */, InsertionType.BEFORE, staticActionMethod);
w.addSubscription(ms);
動作方法可為非靜態,需傳入動作實例。JVM 底層調用不使用反射,效能極佳。開發者可自行控制實例生命週期,輕鬆實現 persingleton()、pertarget()、perthis()、percflow() 等切面實例化模型,且不受 JVM API 語意限制。
JRockit JVM AOP 支援提供了堅實底層基礎,上層仍需構建完整 AOP 框架(切點合成、cflow 實現、切面實例化管理中介層)。其開放的 API 設計使多種 AOP 框架(AspectJ、AspectWerkz、Spring AOP 等)均可受益於 JVM 級編織的高效能與動態性,推動 AOP 技術邁向生產級成熟階段。