2011-10-28 104 views
2

我有一個現有的Eclipse插件提供了一個擴展點。該插件使用標準的Eclipse機制來查找擴展。在這個插件的代碼中,以下代碼用於獲取擴展名。覆蓋現有的Eclipse插件擴展

IConfigurationElement[] config = Platform.getExtensionRegistry() 
      .getConfigurationElementsFor(extensionPoint); 
if (config.length > 0) { 
    return config[0]; 
} 

正如你在代碼中看到的,只有第一個找到的擴展名被使用。這個插件已經提供了一個擴展,這個擴展在默認情況下使用。

現在我需要重寫默認擴展的行爲,所以我創建了一個新的插件並擴展了相同的擴展點。但事實證明,默認擴展名總是IConfigurationElement陣列中的第一個擴展名,所以它總是被拾取。

如何讓我自己的插件首先出現在找到的IConfigurationElement數組中,然後使用我自己的插件而不是默認的插件?

現有的插件是由其他人編寫的,我不想在它絕對必要之前對其進行更改。

回答

1

我想說這是從擴展點獲取擴展的一種不好的方式,無論哪種方式。如果他們只想使用插件系統加載他們創建的特定擴展名,他們可以使用getConfigurationElementsFor(String namespace, String extensionPointName, String extensionId)方法,並關閉其他人使用擴展點的可能性。到目前爲止,還不知道他們會得到哪個擴展。很有可能,在後面的代碼中會出現這樣的情況,假設他們將得到他們的擴展,並且當他們沒有得到他們期望的擴展時,ClassCastException先生就敲開了門。 (在系統中有這樣的bug一次)

當然,最好的方法是更改​​代碼以處理多個擴展!

但是對於你的問題;我不知道ExtensionRegistry如何填充數組,API不說。也許有一種方法可能設置擴展的特定版本,以便將其放在數組中。您必須查看ExtensionRegistry的代碼才能確切瞭解擴展如何找到。我認爲這可能是按字母順序排列的,但我不確定。

另一種方法是使用插件重載現有插件並替換功能。一個非常骯髒的方法,但在某些情況下它是可行的。 See one of my questions regarding this

+2

ExtensionRegistry以非確定方式返回擴展。即在不同的計算機上以不同的順序安裝插件可能會首先返回覆蓋,但這不能保證。擴展點消費者的工作是對他們想要的擴展進行排序/優先/選擇。 –