快速业务通道

Eclipse插件Lazy Start实现原理分析 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15

Eclipse插件Lazy Start实现原理分析

时间:2011-08-13 朱兴

每次提到有关Eclipse插件启动的问题的时候,脑子中自然的反应就是:可以设定为预先启动 (org.eclipse.ui.startup),否则默认的情况下是懒启动(Lazy Start),只有当插件中的功能被真正 调用的时候,插件才会被启动。可能是人也跟着变懒了,也一直没有去留心Eclipse底层是怎么实现这种 懒加载的,只是有个大致的猜测,估计又是用hook机制了。昨天闲着具体看了一下实现,果然是类似的实 现。下面就大致和大家分享一下,说的不一定准确,仅供参考 ~_~。

直接进入主题,我们的Eclipse实例启动肯定要构造工作区,那么ResourcesPlugin肯定会被启动,我 们就在ResourcesPlugin.startup方法设置一个断点,调试栈如下:

Eclipse插件Lazy Start实现原理分析 - 编程入门网

Eclipse插件Lazy Start实现原理分析 - 编程入门网

假设我们对插件类型加载细节不知道,猜测大致过程如下:

1、DefaultClassLoader加载类型(org.eclipse.core.resources.IContainer)

2、EclipseLazyStarter.preFindLocalClass

3、启动资源插件:ResourcesPlugin.startup

Eclipse插件Lazy Start实现原理分析(2)

时间:2011-08-13 朱兴

补充说明:

1、org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader是Eclipse针对OSGI类加载实现的 核心角色,也是eclipse插件默认的类加载器类型,当然,每个插件有自己独立的类加载器实例来负责类 型加载。

2、DefaultClassLoader、BundleLoader、ClasspathManager三者协作,处理类型加载请求(为什么一 个类加载过程要搞的这么复杂呢?Eclipse的考虑是什么呢? 大家思考吧~_~)

【EclipseLazyStarter调用分析】

我们先大致看一下EclipseLazyStarter.preFindLocalClass方法的代码实现:

1 public class EclipseLazyStarter implements ClassLoadingStatsHook, HookConfigurator { 2   public void preFindLocalClass(String name, ClasspathManager manager) throws ClassNotFoundException { 3     //首先判断,如果不需要启动则返回 4      5     //如果插件正在启动,则设定5000ms超时等待;如果超时,直接报错返回 6 7     //启动插件 8   } 9 }

加载类型之前为什么要给回调一下EclipseLazyStarter. preFindLocalClass,又hook了?我们看了一 下EclipseLazyStarter继承了ClassLoadingStatsHook接口,ClassLoadingStatsHook接口的类型API文档 说明了它的作用:

A ClassLoadingStatsHook hooks into the <code>ClasspathManager</code> class.

追踪前面的调用栈,ClassLoadingStatsHook是在ClasspathManager.findLocalClass中被调用的:

1 public Class findLocalClass(String classname) throws ClassNotFoundException { 2     Class result = null; 3     ClassLoadingStatsHook[] hooks = data.getAdaptor().getHookRegistry ().getClassLoadingStatsHooks(); 4     try { 5       for (int i = 0; i < hooks.length; i++) 6         hooks[i].preFindLocalClass(classname, this); 7       result = findLocalClassImpl(classname, hooks); 8       return result; 9     } finally { 10       for (int i = 0; i < hooks.length; i++) 11         hooks[i].postFindLocalClass(classname, result, this); 12     } 13   }

Eclipse插件Lazy Start实现原理分析(3)

时间:2011-08-13 朱兴

再接着往下看之前,我们大致已经知道来的Eclipse的插件lazy start是怎么回事了:

EclipseLazyStarter hook到了插件类加载器的类型加载过程中了,在类型被加载之前会回调 EclipseLazyStarter. preFindLocal

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号