動態外掛程式

「動態外掛程式」可讓您將外掛程式插入和移到執行中的 Eclipse 實例。對於可能會卸載的可重複使用元件而言,「動態外掛程式」提供了一個簡易的方法,可協助您追蹤外掛程式的來回往返。

動態外掛程式可能不會為了應用程式的使用期間而保留,它是用來確定當元件離開時,會清除所有項目。當接聽器連結在「工作台」,且項目已登錄時,關閉之後該項目會保留在原地,而這些外掛程式必須辨識到它們必須進行清除作業。

啟動時讀取所有延伸點實作方式的動作,對應用程式使用期間而言,是足夠的,因為這個假設無法運作,因此是 false。您必須確定有連結接聽器,或者沒有快取任何項目,這樣才會接聽登錄的變更。您必須瞭解工作台中的項目不一定要是靜態的,它們其實是暫時性的,而且隨時都可能會離開。如果您在選寫特定視圖的外掛程式,請先確認視圖是否仍然存在。

身為外掛程式開發人員,您需要確保可能會用到的所有延伸都可以在給定的任何點上出現和消失。當它們消失時,您應該要清除可能代表延伸的所有內部結構,以確認確實消失,並移除可能由它們驅動的任何使用者介面成品。當它們出現時,您應該要增強內部結構,可能的話並建立新的使用者介面成品。假設您的應用程式從登錄讀取,並具有一個延伸,您為它建立了一個記錄,並指派它的位置。它要結束時,您會收到需要執行清除作業的通知。此外,接聽器會宣佈新項目進來的時間,然後再建立它們即可。

org.eclipse.core.runtime.dynamicHelpers.IExtensionTracker 和相關介面提供一個機制,可讓外掛程式開發人員輕易追蹤延伸的往返,以及管理該動作所產生的資源。

下列範例假設您的外掛程式中已有一個延伸點,稱為小組件,且您正在使用 IExtensionTracker。內部而言,您有封裝小組件延伸的 WidgetDescriptor,以及一個用來管理它們的 WidgetRegistry。



	public class WidgetRegistry implements IExtensionChangeHandler {

	
	
	  public WidgetRegistry() {
		
		IExtensionTracker tracker = PlatformUI.getWorkbench()
	
  	.getExtensionTracker();
IExtensionPoint point = Platform.getExtensionRegistry() .getExtensionPoint("my.plugin.namespace", "widget");
IExtension[] extensions = point.getExtensions();
// 起始移入
for (int i = 0; i < extensions.length; i++) { addExtension(tracker, extensions[i]);
} tracker
.registerHandler(this, tracker
.createExtensionPointFilter(point)); } public void addExtension(IExtensionTracker tracker, IExtension extension){ WidgetDescriptor descriptor = new WidgetDescriptor(extension); tracker.registerObject(extension, descriptor,
IExtensionTracker.REF_STRONG); addToInternalStructure(descriptor) } private void addToInternalStructure(WidgetDescriptor descriptor) { // 登錄特定的邏輯 } public void removeExtension(IExtension extension, Object[] objects) { for (int i = 0; i < objects.length; i++) { WidgetDescriptor descriptor = (WidgetDescriptor) objects[i];
removeFromInternalStructure(descriptor);
}
} private void removeFromInternalStructure(WidgetDescriptor descriptor) { // 登錄特定的邏輯 }
} public void dispose() { PlatformUI.getWorkbench() .getExtensionTracker().unregisterHandler(this)
} }

在本例中,「平台使用者介面」在工作台的各個層次中,提供 IExtensionTracker 實例。如果您在追蹤工作台使用期間內的物件,您應該使用 IWorkbench.getExtensionTracker() 所提供的追蹤器。 如果您的物件與特定工作台視窗或頁面有關,則您應該使用 IWorkbenchWindow.getExtensionTracker() 或 IWorkbenchPage.getExtensionTracker() 所提供的追蹤器。 例如,「工作台」追蹤「工作台」層次中的視圖描述子,但實際上是追蹤工作台頁面層次中的視圖實例。您的處理常式可能是透過提供 IFilter 實例到 IExtensionTracker.registerHandler() 的方式,利用特定延伸點來登錄的。 只有在新增或移除符合 IFilter 物件的延伸時,才會呼叫您的處理常式。

當延伸進入執行時期時,就會呼叫這個方法。然後您的處理常式便有機會將新的延伸納入其相關模型中。提供到這個介面,且以 IExtension 為基礎所建立的所有物件,應該透過 IExtensionTracker.registerObject(),用追蹤器來登錄。 當延伸離開執行時期時,便會呼叫這個方法。之前用延伸來登錄的所有物件會被當成引數來傳送。之後您的處理常式就會視需求來清除和刪除物件。建議您取消登錄您的處理常式,以免登錄洩漏。