Java AppletContext 提供的 getApplet() 與 getApplets() 僅能存取「同一 HTML 頁面」上的 Applet。若需跨框架、跨視窗通訊(如股票交易 Applet 與獨立幫助系統 Applet 協作),標準 API 無能為力。
關鍵發現:同一 Codebase 載入的所有 Applet 共享同一 JVM 執行環境,因此可透過 static 欄位交換物件參考,實現跨頁面、跨視窗通訊。
public class AppletB extends Applet {
public static AppletB selfRef = null;
public void init() {
selfRef = this; // 發布自身實例參考
}
public void doSomething() { ... } // 公開業務方法
}
public class AppletA extends Applet {
public void callAppletB() {
AppletB target = AppletB.selfRef;
if (target != null) {
target.repaint(); // 直接呼叫公開方法
target.doSomething();
}
}
}
注意:需處理 selfRef == null 情況(AppletB 尚未初始化)。
AppletListstart() 註冊、stop() 移除getApplet(String name) 風格import java.util.*;
import java.applet.Applet;
public class AppletList {
private static Hashtable applets = new Hashtable();
public static synchronized void register(String name, Applet applet) {
applets.put(name, applet);
}
public static synchronized void remove(String name) {
applets.remove(name);
}
public static synchronized Applet getApplet(String name) {
return (Applet) applets.get(name);
}
public static synchronized Enumeration getApplets() {
return applets.elements();
}
public static synchronized int size() {
return applets.size();
}
}
// 註冊端(股票交易 Applet)
public class TradeApplet extends Applet {
public void start() {
AppletList.register("StockTrade", this);
}
public void stop() {
AppletList.remove("StockTrade");
}
public void executeTrade(String symbol, int qty) { ... }
}
// 呼叫端(幫助系統 Applet)
public class HelpApplet extends Applet {
public void runWizard() {
TradeApplet trade = (TradeApplet) AppletList.getApplet("StockTrade");
if (trade != null) trade.executeTrade("AAPL", 100);
}
}
| 條件 | 說明 |
|---|---|
| 同一 Codebase | 所有 Applet 必須從相同目錄載入(同源策略) |
| 單一瀏覽器進程 | 若使用者開啟兩個獨立瀏覽器視窗(非分頁),可能擁有獨立 JVM,通訊失效 |
| 信任關係 | 簽名 Applet 與非簽名 Applet 混合可能觸發安全例外 |
經測試通過的環境:
Applet 技術已淘汰,現代 Web 應用建議採用:
靜態註冊中心模式巧妙繞過標準 API 限制,展現 Java 共享執行環境的特性。雖然 Applet 時代已終結,但「共享記憶體通訊」的設計思維在微服務共享記憶體、OSGI 服務註冊、Android 進程間通訊等領域仍具參考價值。