[zt]Eclipse插件开发两点小结

FROM:http://bbs.buaa.edu.cn/pc/pccon.php?id=35&tid=0&nid=749&s=all

 

这两天看了一下Eclipse的插件开发,参考的书就是那本著名的Contributing to Eclipse。

把两点体会记录如下:

1、Extension和Extension-point

Extension和Extension-point是相互关联的,由Extension-point定义插件具备的扩展点并且定义了如何使用这些扩展点(由Schema中定义),而Extension则是根据扩展点中定义的Schema来描述扩展的内容。Extension定义的是对已有插件进行的扩展,其中point是扩展源的id。对于不同的扩展源,Extension的元素定义各不相同。Extension-piont定义的是本插件向外提供的扩展功能,利用Schema来定义Extension。

例如:

对Extension-point定义如下:

xml 代码
  1. <extension-point id="listeners" name="Test Listeners" Schema="schema/listeners.exsd">  

而在Schema指定的listeners.exsd中定义了如何描述扩展内容,下面的例子说明了extension中包含listener元素,并需要对class属性进行描述。  

xml 代码
  1. <element name="listener">  
  2.       <complexType>  
  3.          <attribute name="class" type="string">  
  4.             <annotation>  
  5.                <documentation>  
  6.                      
  7.                </documentation>  
  8.             </annotation>  
  9.          </attribute>  
  10.       </complexType>  
  11.    </element>  

 

这样,如果当需要扩展listener的时候,只需要在plugin.xml中按照Schema中的定义书写Extension即可:   

xml 代码
  1. <extension  
  2.          point="org.eclipse.contribution.junit.listeners">  
  3.     <listener  
  4.      class="org.eclipse.contribution.junit.ResultViewListener">  
  5.     </listener>  
  6.    </extension>  

在插件实现的时候,从plugin.xml中按照schema中定义的Extension的结构读入信息。

具体代码如下:

java 代码
  1. ArrayList results = new ArrayList();   
  2.   IExtensionRegistry registry = Platform.getExtensionRegistry();   
  3.   IExtensionPoint[] extensions = registry.getExtensionPoints("org.eclipse.contribution.junit");//从plugin.xml中读入listener扩展点   
  4.   for(int i = 0 ; i < extensions.length ; i++) {   
  5.    IConfigurationElement [] configElements =    
  6.     extensions[i].getConfigurationElements();   
  7.    for(int j = 0 ; j < configElements.length ; j++) {   
  8.     try {   
  9.   
  10.      //根据schema中的定义,读出class中定义的类名,并创建实例   
  11.      Object listener = configElements[j].createExecutableExtension("class");   
  12.      if(listener instanceof ITestRunListener) {   
  13.       results.add(listener);   
  14.      }   
  15.     }   
  16.     catch (CoreException e) {   
  17.       e.printStackTrace();   
  18.     }   
  19.    }   
  20.   }   
  21.   

注:书中的例子与我写的有一定区别,这是由于Eclipse版本的原因。书中的代码使用的是早期版本的Eclipse,那些代码在3.0版本中已经decrapted。而且,定义extension-point的时候也不太一样。

通过Extension和Extension-point充分体现了Eclipse开发的原则,如何合理的应用这项技术,成为在Eclipse上进行系统设计的关键。

2、查询例子的技巧

在Eclipse插件开发中,别人写的插件就是开发的最好例子。通过Eclipse的Search功能,可以很方便的找到。

你可能感兴趣的:(eclipse,xml,PHP,JUnit,J#)