精彩的人生

好好工作,好好生活

BlogJava 首页 新随笔 联系 聚合 管理
  147 Posts :: 0 Stories :: 250 Comments :: 0 Trackbacks

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

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

 1IExtensionRegistry registry = Platform.getExtensionRegistry();
 2IExtensionPoint point = registry.getExtensionPoint(“org.eclipse.ui.popupMenus”);
 3IExtension[] extensions = point.getExtensions();
 4for (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,问题就解决了。

     
posted on 2005-12-14 14:04 hopeshared 阅读(2262) 评论(8)  编辑  收藏 所属分类: Eclipse

Feedback

# re: 从扩展点中load class 2005-12-14 14:57 SimonLei
element.createExecutableExtension 就行了,不用那么复杂  回复  更多评论
  

# re: 从扩展点中load class 2006-07-28 18:28 joan
老兄,我刚接触eclipse,现在正好用到自定义扩展点呀,可网上的资料也很少,看了ECLIPSE的帮助后只知道怎么编辑扩展点模式,但不知道你上面写的那些代码该放在什么地方?能否给小妹发一份有关自定义扩展点和如何扩展的完整的资料呢,先谢了!邮箱是john_82@tom.com  回复  更多评论
  

# re: 从扩展点中load class 2006-07-30 10:32 hopeshared
@joan

看看这个http://www.blogjava.net/hopeshared/archive/2006/07/25/59983.html  回复  更多评论
  

# re: 从扩展点中load class 2006-07-31 12:28 joan
@hopeshared
谢谢你!看了你的那篇文章我明白了许多,但是还有个问题想请教一下:如果我在A插件自定义了一个扩展点X,在B.C或更多的插件扩展了这个扩展点,那我希望从插件A中能知道哪些插件扩展了X扩展点,以及从A中获取B.C...插件里的一些文件,该怎么办呢?
  回复  更多评论
  

# re: 从扩展点中load class 2006-08-02 16:55 寒风
期待hopeshared对楼上问题的解惑  回复  更多评论
  

# re: 从扩展点中load class 2006-08-02 20:55 hopeshared
回复joan

我不明白你为什么会有这样的疑问,因为这个帖子说的就是你问的这个问题,帖子中的代码就是在A插件中找出所有扩展点X的实现

IExtensionPoint point = registry.getExtensionPoint(“org.eclipse.ui.popupMenus”);
得到A中定义的这个扩展点对象

IExtension[] extensions = point.getExtensions();
得到所有扩展点X的实现

extensions[i]是扩展点X的一个实现

IConfigurationElement[] elements = extensions[i].getConfigurationElements();
将得到B,C的plugin.xml中如何实现该扩展点,也就是对应的那段xml

elements[j].getAttribute("your attribute")得到这个属性的值,如elements[j].getAttribute("targetID")就是指<... targetID="aaaa"/>将返回aaaa
elements[j].getName()将返回这个元素的名称,如<target .../>就该返回target,这两个其实就可以看作DOM操作了

你说的“从A中获取B.C...插件里的一些文件”,那么你定义扩展点的时候就必须考虑,你需要什么文件,假如你需要一个类,<... targetClass="ClassA">,前面已经说明了如何得到"ClassA"这样的字符串,我写的这篇blog也是由于直接用Class.forName("ClassA")无法创建类的实例,那么用
WorkbenchPlugin.createExtension(element, "targetClass");
就可以了

所以,你的问题,根源在于如何定义扩展点,而不是如何找出扩展点的实现。
  回复  更多评论
  

# re: 从扩展点中load class 2006-08-07 12:48 joan
@hopeshared
呵呵,问题已经解决了,谢谢你!
  回复  更多评论
  

# re: 从扩展点中load class 2006-08-17 01:32 寒风
hopeshared,能否将‘如何定义扩展点’的东东发一些给我?谢谢
tie212@163.com  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问