首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Eclipse Plug-in Lazy Start 實作原理深度解析:Class Loading Hook 機制

     編輯:Java 相關知識

Eclipse 預設採用懶啟動:Plug-in 僅在其類別首次被載入時才啟動。本文透過除錯堆疊追蹤,揭示底層實作——EclipseLazyStarter 掛載於 ClasspathManager 的 ClassLoadingStatsHook。

啟動觸發鏈路

  1. 執行緒嘗試載入某 Plug-in 的類別(如 org.eclipse.core.resources.IContainer)。
  2. DefaultClassLoader 委派 BundleLoader、ClasspathManager 尋找類別。
  3. ClasspathManager.findLocalClass 遍歷所有 ClassLoadingStatsHook 呼叫 preFindLocalClass。
  4. EclipseLazyStarter.preFindLocalClass 攔截:若目標 Plug-in 未啟動,立即啟動;若正在啟動,等待 5 秒超時;超時拋出 ClassNotFoundException 避免死結。

Hook 註冊過程

  1. Framework 啟動建立 BaseAdaptor,構造函數初始化 HookRegistry。
  2. HookRegistry.initialize() 讀取 hookconfigurators.properties,載入所有 HookConfigurator 實作。
  3. 清單包含 org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter,其 addHooks 將自身註冊為 ClassLoadingStatsHook。

關鍵程式碼片段

// ClasspathManager.findLocalClass
ClassLoadingStatsHook[] hooks = adaptor.getHookRegistry().getClassLoadingStatsHooks();
for (hook : hooks) hook.preFindLocalClass(classname, this);
result = findLocalClassImpl(classname, hooks);
for (hook : hooks) hook.postFindLocalClass(classname, result, this);

// EclipseLazyStarter.preFindLocalClass
public void preFindLocalClass(String name, ClasspathManager manager) {
    if (!needToActivate) return;
    if (bundle.isStarting()) wait(5000); // 超時直接報錯
    bundle.start(); // 啟動 Plug-in
}

啟動逾時風險與對策

5 秒硬性逾時包含依賴 Plug-in 啟動時間。啟動器避免耗時操作(如資料庫連線、網路呼叫),否則極易觸發 timed out waiting for thread to finish starting bundle 錯誤。建議將初始化延遲至背景執行緒或服務啟動階段。

其他 Hook Policy

HookRegistry 尚支援 ClassLoadingHook、BundleFileWrapperFactoryHook、StorageHook、AdaptorHook 等,資源管理(如 CVS、ClearCase 整合)亦大量運用 IMoveDeleteHook 機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved