好像利用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
}

2

3

4



5

6



7

8

9

10

11

在一個插件項目中,這樣的代碼一點問題都沒有。
但是,我現在的項目分為幾個插件,擴展點的定義放在了插件項目A中,相關的接口和擴展點實現收集器(這是我自己取的名字)也在A中,但是擴展點的實現是其他的插件,比如插件B就實現了A中定義的擴展點。那么他們之間的依賴關系是
A <---------- B
換句話說,在A中看不到B中的代碼,那么問題就來了:上面那段代碼的第8行將會報出class not found的異常。
如何解決這個問題?
可能是我對Eclipse的核心代碼太不熟悉了,所以這個問題困擾了我很久。
解決的方法是,將第8行替換為

這個方法將激活本次實現所在的插件項目的Bundle,問題就解決了。