如果想要允许其它插件扩展或定制插件的功能,则应定义扩展点。就扩展而言,定义扩展点的第一步是将一些标记添加至插件的 plugin.xml 文件。以下是一个示例:
<?xml version="1.0" ?> <plugin name="Simple Extension Point Plugin" id="org.eclipse.sample" version="1.0"> <runtime> <library name="extpt.jar" /> </runtime> <extension-point name="Sample Extension Point" id="sampleExtensionPoint"/> </plugin>
这是定义您自已的扩展点所需的全部内容。连接至此扩展点的扩展的结构不是由平台解释的,而是应遵循由扩展点提供程序定义的模式。唯一的限制是扩展标记必须是有效的 XML。一旦定义了扩展点,就可以在运行时查询平台的插件注册表以查询和处理可能存在的任何扩展。在运行时,扩展显示为 IExtension 对象。扩展反过来由 IConfigurationElement 对象树组成,扩展标记中的每个元素为一个对象。以下代码片断查询与在上面定义的扩展点相关联的所有扩展的插件注册表。
IPluginRegistry registry = Platform.getPluginRegistry(); IExtensionPoint point = registry.getExtensionPoint("org.eclipse.sample.sampleExtensionPoint"); if (point != null) { IExtension[] extensions = point.getExtensions(); System.out.println("Found " + extensions.length + " extensions"); }
在简单情况下,扩展点与其扩展之间的唯一交互作用包含在扩展标记中。扩展可以直接在扩展标记的 XML 内提供一些数据或首选项设置,然后扩展点插件读取并处理该信息以提供一些定制行为。
借助更高级的扩展点,您可能想要在运行时与扩展定义的对象交互。此处的诀窍是定义扩展点的插件通常不知道扩展中类和包的名称,所以它必须定义接口来描述它期望的类结构。然后,它可以使用 IExecutableExtension 来实例化扩展的插件中的各个类,并在运行时使用该接口与对象交互。
要以示例来演示,来自 plugin:xml 文件的以下片段定义 hook 至较早定义的样本扩展点的扩展:
<extension name="Sample Extension" id="myExtension" point="org.eclipse.sample.sampleExtensionPoint"> <someObject> <run class="org.eclipse.examples.SomeClass"/> </someObject> </extension>
此扩展包括可执行扩展的标记,该标记包括要实例化的类的名称。此类应符合定义扩展点的插件定义的接口。如较早描述的那样,此示例中标记("someObject" 和 "run")的名称是任意的。这些标记将由扩展点模式定义。
对于此示例,可执行扩展的接口称为 ISomeInterface。扩展点的插件中的下列代码片断将查询插件注册表,并实例化扩展点“sampleExtensionPoint”的所有可执行扩展:
IPluginRegistry registry = Platform.getPluginRegistry(); IExtensionPoint point = registry.getExtensionPoint("org.eclipse.sample.sampleExtensionPoint"); IExtension[] extensions = point.getExtensions(); for (int i = 0; i < extensions.length; i++) { IConfigurationElement[] elements = extensions[i].getConfigurationElements(); for (int j = 0; j < elements.length; j++) { if ("someObject".equals(elements[j].getName())) { ISomeInterface object = (ISomeInterface)elements[j].createExecutableExtension("run"); System.out.println("Found an executable extension: " + object); } } }
这样全都齐了!有关更多信息,浏览 org.eclipse.core.runtime 包的 javadoc,或查看在自述文件工具中定义的扩展点 (有关安装指示信息,参见示例指南)。要查看的最好示例是 Eclipse 平台自身定义的扩展点。