从扩展点中load class

从扩展点中load class

        好像利用Eclipse自定义扩展点的人不多。

        在我以前做的项目中,用了自定义扩展点,但是使用这个扩展点的文件也在这个项目中,整个项目就是一个插件。所以,加载扩展点的方式很简单:

 1 IExtensionRegistry registry  =  Platform.getExtensionRegistry();
 2 IExtensionPoint point  =  registry.getExtensionPoint(“org.eclipse.ui.popupMenus”);
 3 IExtension[] extensions  =  point.getExtensions();
 4 for  ( int  i  =   0 ; i  <  extensions.length; i ++ ) {
 5    IConfigurationElement[] elements = extensions.getConfigurationElements();
 6          for (int j = 0; j < elements.length; j++){
 7                String eleType = elements[j].getName();
 8                Class importantClass = Class.forName(element[j].getAttribute(MyConstants.ATTR_MODELCLASS)).newInstance();
 9                ……
10          }

11}

        在一个插件项目中,这样的代码一点问题都没有。

        但是,我现在的项目分为几个插件,扩展点的定义放在了插件项目A中,相关的接口和扩展点实现收集器(这是我自己取的名字)也在A中,但是扩展点的实现是其他的插件,比如插件B就实现了A中定义的扩展点。那么他们之间的依赖关系是

A  <----------  B

        换句话说,在A中看不到B中的代码,那么问题就来了:上面那段代码的第8行将会报出class not found的异常。

        如何解决这个问题?

        可能是我对Eclipse的核心代码太不熟悉了,所以这个问题困扰了我很久。

        解决的方法是,将第8行替换为

WorkbenchPlugin.createExtension(element, MyConstants.ATTR_MODELCLASS);

       这个方法将激活本次实现所在的插件项目的Bundle,问题就解决了。

     

你可能感兴趣的:(从扩展点中load class)