在Eclipse中,您可以发布要使用的下游插件的扩展点。 循环遍历您的点的扩展时,从注册表返回,是否有办法知道/控制它们返回的顺序。
eclipse如何根据磁盘上的文件顺序查找扩展名?名称?
更新
有人问我为什么要这样做,所以我会举例说明用例
在eclipse中,如果运行MultiPageEditor插件示例,则将创建一个包含三个选项卡的编辑器。如果我发布了一个扩展,允许添加选项卡,并希望它们以特定/逻辑/上下文顺序添加,而不是随机/特定于操作系统的文件排序顺序。
答案 0 :(得分:2)
您对解析或返回的顺序没有任何直接控制权,但这无关紧要。为什么按特定顺序归还他们很重要?值得一提的是,我依旧回忆起每个扩展位置按照它们的定义顺序依次读取,并且该位置的每个插件都按字母顺序读取,但这可能已经改变,因为P2在Eclipse 3.4中出现,因为处理非常不同。我不会依赖任何读取顺序,因为你不应该知道这种知识。
如果您需要订购贡献,当您从注册表获得扩展时,可以将它们添加到列表中,实现比较器,并根据需要对它们进行排序。或者您可以按顺序迭代它们并在继续之前对结果对象进行排序。
这article有点旧,但我相信仍然有效。它为您提供了有关扩展点处理的一些指示。
答案 1 :(得分:2)
当我想订购扩展点贡献时,我添加了一个优先级编号,如int 10。
我只使用数字10,20,30,...因为您可以在将来轻松放置元素。这可用于订购按钮,复合材料或您无法按名称订购的所有内容。
您可以将此优先级添加到用于定义扩展点的界面中。或者您可以在扩展点描述中使用字段。
当您收集所有扩展点贡献时,您可以要求优先级,并在返回之前在链接列表中订购贡献。
String tmpExtensionPoint = "EXTENSION POINT ID"; //$NON-NLS-1$
IExtensionRegistry registry = Platform.getExtensionRegistry();
IConfigurationElement[] elements = registry.getConfigurationElementsFor(tmpExtensionPoint);
List references = new LinkedList();
if (elements != null && elements.length > 0) {
for (int i = 0; i < elements.length; i++) {
try {
Object obj = elements[i].createExecutableExtension("class");
references.add((IExtensionPointInterface)obj); //$NON-NLS-1$
} catch (CoreException e) {
logger.error("Get Extension Point For " + tmpExtensionPoint, e);
}
}
}
//...
//ORDER here
return references;
订单代码可能是这样的:
Arrays.sort(references, new Comparator() {
public int compare(Object arg0, Object arg1) {
if (!(arg0 instanceof IExtensionPointInterface )) {
return -1;
}
if (!(arg1 instanceof IExtensionPointInterface )) {
return -1;
}
IExtensionPointInterface part0 = (IExtensionPointInterface)arg0;
IExtensionPointInterface part1 = (IExtensionPointInterface)arg1;
if (part0.getPriority() < part1.getPriority()) {
return -1;
}
if (part0.getPriority() > part1.getPriority()) {
return 1;
}
return 0;
}
});