覆盖现有的Eclipse插件扩展。

3
我有一个现有的Eclipse插件,提供了扩展点。该插件使用标准的Eclipse机制来查找扩展。在该插件的代码中,以下代码用于获取扩展。
IConfigurationElement[] config = Platform.getExtensionRegistry()
            .getConfigurationElementsFor(extensionPoint);
if (config.length > 0) {
    return config[0];
}

正如您在代码中看到的那样,只有找到的第一个扩展被使用。这个插件已经提供了一个扩展,在默认情况下使用这个扩展。
现在我需要重写默认扩展的行为,所以我创建了一个新的插件并扩展了相同的扩展点。但是事实证明,默认扩展总是出现在IConfigurationElement数组中的第一个位置,因此它总是被选中。
我该如何让自己的插件出现在找到的IConfigurationElement数组的第一位,然后我的插件就会代替默认的扩展?
现有的插件是由其他人编写的,我不想在绝对必要之前对其进行更改。
1个回答

1
我认为这是从扩展点获取扩展的不好方式。如果他们只想使用插件系统来加载他们创建的特定扩展,他们可以使用getConfigurationElementsFor(String namespace, String extensionPointName, String extensionId)方法,从而关闭其他人使用扩展点的可能性。目前还没有确定的方法可以知道他们将获得哪个扩展。很有可能,在代码的后续实例中,假设他们会获得他们的扩展,当他们没有得到他们期望的扩展时,就会出现ClassCastException错误。(我曾经在一个系统中遇到过这样的错误)
当然,最好的方法是改变代码以处理多个扩展!
但是回答你的问题;我不知道ExtensionRegistry如何填充数组,API没有说明。也许有一种方法可以设置您的扩展的特定版本,使其排在数组的第一位。您需要查看ExtensionRegistry的代码,才能确切地了解扩展是如何被发现的。我认为它可能是按字母顺序排列的,但我不确定。

另一种方法是使用你的插件来重载现有插件并替换功能。这是一种非常不好的方法,但在某些情况下是可行的。请参阅我关于此的一个问题


2
ExtensionRegistry以非确定性的方式返回扩展。例如,在不同的计算机上以不同的顺序安装插件可能会首先返回覆盖一个...但是没有保证。这是扩展点消费者的工作,要对他们想要的扩展进行排序/优先级/选择。 - Paul Webster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接