在Eclipse中如何提供扩展点

      这只是一个很简单的例子,涉及到两个plugins(bundles),其中一个叫provider,提供了一个扩展点,另外一个叫customer,扩展了provider提供的扩展点,以下步骤在Eclipse中进行
1、在provider中创建一个ICalculator接口如下:
public interface ICalculator {
  long add(int a,int b);
  long multiple(int a,int b);
}
2、打开provider的plugin.xml文件,在Extension points tab页中添加一个扩展点,定义如下:
ID:Calculator
Name:Calculator
Schema:schema/Calculator.exsd
 
在provider的plugin.xml中会生成下面的片断:
<extension-point id="Calculator" name="Calculator" schema="schema/Calculator.exsd"/>
 
编辑schema/Calculator.exsd,使其等同于下面的dtd:
<!ELEMENT extension (Calculator)>
<!ATTLIST extension
    point CDATA #REQUIRED
    id    CDATA #IMPLIED
    name  CDATA #IMPLIED>
<!ELEMENT Calculator EMPTY>
<!ATTLIST Calculator
    id    CDATA #REQUIRED
    class CDATA #REQUIRED
    type  (normal|abnormal) >
 
3、用下面这段代码处理其他plugin对这个扩展点做的扩展:
IExtensionRegistry iextensionregistry = Platform.getExtensionRegistry();
IExtensionPoint iextensionpoint = iextensionregistry.getExtensionPoint("provider", "Calculator");
IExtension extensions[] = iextensionpoint.getExtensions();

   if (extensions != null) {
   System.out.println("There are " + extensions.length + " implementors of ICalculator");
   for (int i = 0; i < extensions.length; i++) {
     IConfigurationElement aiconfigurationelement[] = iextensionpoint
                                         .getConfigurationElements();
     if (aiconfigurationelement != null) {
        for (int j = 0; j < aiconfigurationelement.length; j++)
           if (aiconfigurationelement[j].getName().equals( "Calculator")) {
           String id = aiconfigurationelement[j].getAttribute("id");
           String clazz = aiconfigurationelement[j].getAttribute("class");
           String type = aiconfigurationelement[j].getAttribute("type");
           System.out.println("ID:" + id + ", class:" + clazz  + ", type:" + type);
           try {
              Object obj = aiconfigurationelement[j].createExecutableExtension("class");
              if (obj instanceof ICalculator) {
                  ICalculator cal = (ICalculator) obj;
                  System.out.println("6+7=" + cal.add(6, 7));
              }
           } catch (Exception e) {
               e.printStackTrace();
           }
        }
      }
    }
  }
注意加绿的代码 IExtensionRegistry对象的getExtensionPoint方法有两个参数,第一个是exsd的targetNameSpace,默认为provider的Plugin ID,第二个参数是扩展点的id。IConfigurationElement对象的createExecutableExtension("class")方法意思是在"Calculator"元素中(见最后的extension代码片断)寻找一个叫class的attribute(其值应该是实现了ICalculator的一个类的full qualified name),将其值对应的Object构建出来
4、在Customer plugin中新建一个类实现Provider plugin中的ICaculator接口,代码如下:
public class DefaultCalculator implements ICalculator {
   public long add(int a, int b) {
       return a + b;
   }
  public long multiple(int a, int b) {
      return a * b;
  }
}
5、打开Customer的plugin.xml,在Extensions Tab页中新建一个扩展,扩展provider提供的扩展点,代码片断如下:

<extension
         point="provider.Calculator">
      <Calculator
            class="customer.DefaultCalculator"
            id="defaultCalculator"
            type="normal"/>
</extension>

参考资料:使用 XML: 定义和加载扩展点 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值