我有一个现有的Eclipse插件,它提供了一个扩展点。该插件使用标准的Eclipse机制来查找扩展。在此插件的代码中,以下代码用于获取扩展名。
IConfigurationElement[] config = Platform.getExtensionRegistry()
.getConfigurationElementsFor(extensionPoint);
if (config.length > 0) {
return config[0];
}
正如您在代码中看到的,只使用了第一个找到的扩展名。此插件已提供扩展名,此扩展名在默认情况下使用。
现在我需要覆盖默认扩展的行为,因此我创建了一个新的插件并扩展了相同的扩展点。但事实证明,默认扩展名始终是IConfigurationElement
数组中的第一个,所以它总是被拾取。
如何在找到的IConfigurationElement
数组中首先显示自己的插件,然后使用自己的插件而不是默认插件?
现有的插件是由其他人编写的,我不想在它完全必要之前对其进行更改。
答案 0 :(得分:1)
我认为这是从扩展点获取扩展的一种不好的方式,无论哪种方式。如果他们只是想使用pluginsystem来加载他们创建的特定扩展,他们可以使用getConfigurationElementsFor(String namespace, String extensionPointName, String extensionId)
方法,并关闭其他人使用扩展点的可能性。截至目前,还没有确定的方法可以知道他们将获得哪种扩展。机会是,稍后代码中的实例假设他们将获得他们的扩展,当他们没有获得他们期望的扩展时,ClassCastException先生敲响了门。 (曾经在系统中出现过这样的错误)
当然最好的方法是更改代码以处理许多扩展!
但对你的问题;我不知道ExtensionRegistry如何填充数组,API没有说。也许有一种方法可能设置一个特定版本的扩展,允许它放在数组的第一位。您必须查看ExtensionRegistry的代码才能确切了解扩展的查找方式。我认为它可能按字母顺序排列,但我不确定。
另一种方法是使用插件重载现有插件并替换功能。一种非常肮脏的方法,但在某些情况下它是可行的。 See one of my questions regarding this