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定义如下:
- <extension-point id="listeners" name="Test Listeners" Schema="schema/listeners.exsd">
而在Schema指定的listeners.exsd中定义了如何描述扩展内容,下面的例子说明了extension中包含listener元素,并需要对class属性进行描述。
- <element name="listener">
- <complexType>
- <attribute name="class" type="string">
- <annotation>
- <documentation>
- </documentation>
- </annotation>
- </attribute>
- </complexType>
- </element>
这样,如果当需要扩展listener的时候,只需要在plugin.xml中按照Schema中的定义书写Extension即可:
- <extension
- point="org.eclipse.contribution.junit.listeners">
- <listener
- class="org.eclipse.contribution.junit.ResultViewListener">
- </listener>
- </extension>
在插件实现的时候,从plugin.xml中按照schema中定义的Extension的结构读入信息。
具体代码如下:
- ArrayList results = new ArrayList();
- IExtensionRegistry registry = Platform.getExtensionRegistry();
- IExtensionPoint[] extensions = registry.getExtensionPoints("org.eclipse.contribution.junit");//从plugin.xml中读入listener扩展点
- for(int i = 0 ; i < extensions.length ; i++) {
- IConfigurationElement [] configElements =
- extensions[i].getConfigurationElements();
- for(int j = 0 ; j < configElements.length ; j++) {
- try {
- //根据schema中的定义,读出class中定义的类名,并创建实例
- Object listener = configElements[j].createExecutableExtension("class");
- if(listener instanceof ITestRunListener) {
- results.add(listener);
- }
- }
- catch (CoreException e) {
- e.printStackTrace();
- }
- }
- }
注:书中的例子与我写的有一定区别,这是由于Eclipse版本的原因。书中的代码使用的是早期版本的Eclipse,那些代码在3.0版本中已经decrapted。而且,定义extension-point的时候也不太一样。
通过Extension和Extension-point充分体现了Eclipse开发的原则,如何合理的应用这项技术,成为在Eclipse上进行系统设计的关键。
2、查询例子的技巧
在Eclipse插件开发中,别人写的插件就是开发的最好例子。通过Eclipse的Search功能,可以很方便的找到。