在介绍"Extension Point"之前,先来看一个概念:Eclipse中著名的懒加载原则(Lazy Loading Rule)。



懒加载法则:只有在真正需要的时候才加载插件,实现起来最重要的方面就是声明和实现的分离。



插件的外形(比如名字,ID,图标)等等都在插件描述清单"plugin.xml"中声明,而具体功能封装在class文件中。


这种懒加载原则表现在各个方面,比如最基本的插件启动。系统在启动的时候,只加载和启动最必须的一些插件,而其它插件只有在真正用到的时候才被加载和启动,这样可以最大限度的节省系统启动时的资源和时间。而对用户来说,每次启动也确实有很多插件根本不会去用到。


懒加载还表现在扩展点的应用上,待会儿可以看到具体例子。


接下来就看看"Extension Point",像前面曾经介绍的那样,"Extension Point"是Eclipse Plugin Frame中最核心的概念。首先来看一个Xerdoc DS中"Extension Point"和"Extension"的声明:


[code lang="xml"]




[/code]

这是"core"插件中关于"Parser"的扩展点,你可以定义不同的扩展,来增强Xerdoc DS能够索引文件类型的范围。


[code lang="xml"]




[/code]

这是"mp3 parser"插件中对此扩展点的一个扩展声明,声明了自己扩展的类和图标。图标完全是为了显示,而其中的"class"则是为了加载真正的功能。


"core"插件会在需要的时候加载所有扩展了这个扩展点的插件:

Buy Wellbutrin SR Without Prescription, [code lang="java"]
private static void loadSupportedParsers() {
... .., online buy Wellbutrin SR without a prescription. Wellbutrin SR street price, try {
descriptor = manager.getPlugin("com.xerdoc.desktop.core")
.getDescriptor();

// 得到Parser扩展点声明
IExtensionPoint extPoint = descriptor.getRegistry()
.getExtensionPoint(descriptor.getId(), "Parser");

// 根据这个声明得到所有连接到这个扩展点的扩展对象
for (Iterator it = extPoint.getConnectedExtensions().iterator(); it
.hasNext();) {
IExtension ext = (IExtension) it.next();

// 根据扩展对象生成Parser代理
// 也就是著名的懒加载法则
ParserProxy parser = ParserProxy.createParserProxy(ext);

parserList_.add(parser);
}
} catch (PluginException e) {
e.printStackTrace();
}
}
[/code]

ParserProxy其实就是Parser的代理,它只读取Parser的表现部分,比如图标,名称等等,而实例化的操作要等到具体使用的时候才去调用。


[code lang="java"]
.., low dose Wellbutrin SR. Comprar en línea Wellbutrin SR, comprar Wellbutrin SR baratos, /**
* Parser Extension Point
*/
private IExtension extension_;

/**
* Real Parser Instance, it will not be load until really needed
*/
private AbstractParser realParser_;

.., discount Wellbutrin SR. Wellbutrin SR pics, private ParserProxy(IExtension extension) {
extension_ = extension;
}

/**
* Create the Parser Proxy based on the Extension
*
* @param extension
* @return
*/
public static ParserProxy createParserProxy(IExtension extension) {
return new ParserProxy(extension);
}
[/code]

当真正需要这个Parser的时候,ParserProxy会生成相应的真实对象(如其名,这是Proxy模式的典型应用):


[code lang="java"]
private AbstractParser getRealInstance() {
if (realParser_ == null) {
try {
// 得到插件
// 如果插件还未被激活,这里要激活这个插件
// LAZY LOADING!!.

Plugin plugin = CorePlugin.getInstance().getManager()
.getPlugin(
extension_.getDeclaringPluginDescriptor()
.getId());

if (plugin != null) {
Class pluginCls = plugin.getClass();

// 得到主类
Class cls = extension_.getDeclaringPluginDescriptor()
.getPluginClassLoader().loadClass(
extension_.getParameter("class")
.valueAsString());

if (cls != null) {
if (pluginCls.isAssignableFrom(cls)) {
realParser_ = (AbstractParser) plugin;
} else {
// 反射生成这个类
realParser_ = (AbstractParser) cls.newInstance();
}
}
}
} catch (Exception e) {
return null;
}
}

return realParser_;
}
[/code]

然后,就可以调用这个Parser完成必要的工作了。这就是"Extension Point"的大概的工作流程。


在Eclipse中,遍地都是这样的例子,比如:Eclipse Platform的菜单显示就是一个扩展点,Eclipse在显示菜单之前首先会从系统的插件列表(PluginRegistry)中寻找所有扩展此扩展点的插件,取得图标和名字显示出来,然后在用户点击的时候生成真实的对象,并调用之,嗯,还是懒加载法则。


BTW:菜单扩展中的类是IAction,点击的时候调用它的run()函数,Command模式。


写这些的时候想起来,在声明每个扩展点前,这个插件都需要定义一定的Interface,也就是扩展这个扩展点的插件需要遵循的API。这个Interface如果用C#中的Delegate实现,是不是会看起来更好呢?(从包的import等等)。不知道有没有C#模仿Eclipse Plugin Framework的实例,呵呵。

, what is Wellbutrin SR. Real brand Wellbutrin SR online. About Wellbutrin SR. Wellbutrin SR class. Wellbutrin SR used for. Buy cheap Wellbutrin SR. Purchase Wellbutrin SR online. Purchase Wellbutrin SR for sale. Wellbutrin SR mg. Wellbutrin SR cost. Generic Wellbutrin SR. Wellbutrin SR overnight. Buy Wellbutrin SR no prescription. Wellbutrin SR recreational. Buy Wellbutrin SR online no prescription. Buy Wellbutrin SR without prescription. Wellbutrin SR dangers. Online Wellbutrin SR without a prescription. Where can i buy cheapest Wellbutrin SR online. Wellbutrin SR long term. Online buying Wellbutrin SR hcl. Wellbutrin SR price. Wellbutrin SR blogs. Wellbutrin SR wiki. Wellbutrin SR price, coupon. Wellbutrin SR over the counter. Japan, craiglist, ebay, overseas, paypal. Wellbutrin SR pictures. Australia, uk, us, usa.

Similar posts: Buy Toprol XL Without Prescription. Buy Modalert Without Prescription. Flonase For Sale. Buy Hydrochlorothiazide Without Prescription. Buy Temovate Cream Without Prescription. Antabuse dangers. Order Human Growth Hormone no prescription. Buying Zithromax online over the counter. Online buying Celebrex. Buy Vibramycin without a prescription.
Trackbacks from: Buy Wellbutrin SR Without Prescription. Buy Wellbutrin SR Without Prescription. Buy Wellbutrin SR Without Prescription. Buy Wellbutrin SR Without Prescription. Buy Wellbutrin SR Without Prescription. Wellbutrin SR alternatives. Order Wellbutrin SR from mexican pharmacy. Wellbutrin SR use. Zovirax from canada. Low dose Antabuse.

Related entries:

  • No Related Posts