Eclipse源代码分析
Eclipse源代码分析
一、概述
走入Eclipse的内核,看看它到底是怎么工作的?
1、Eclipse源代码
下载地址:http://download.eclipse.org/eclipse/downloads
2、源代码阅读工具 Source Insight V3.5
它其实是一个代码编辑软件,因为有强大的代码分析工具,可以很方便地跟踪代码的相关性,所以常用来作为阅读代码的工具。
下载地址:http://sourceinsight.com/down35.html
为了方便代码的分析,我们只提取以下几个插件的代码:
org.eclipse.platform org.eclipse.platform_3.1.1.jar
org.eclipse.core.commands org.eclipse.core.commands_3.1.0.jar
org.eclipse.core.expressions org.eclipse.core.expressions_3.1.0.jar
org.eclipse.core.runtime org.eclipse.core.runtime_3.1.1.jar
org.eclipse.help org.eclipse.help_3.1.0.jar
org.eclipse.jface org.eclipse.jface_3.1.1.jar
org.eclipse.osgi org.eclipse.osgi_3.1.1.jar
org.eclipse.swt.win32.win32.x86 org.eclipse.swt.win32.win32.x86_3.1.1.jar
org.eclipse.swt org.eclipse.swt_3.1.0.jar
org.eclipse.ui.workbench org.eclipse.ui.workbench_3.1.1.jar
org.eclipse.ui org.eclipse.ui_3.1.1.jar
org.eclipse.update.configurator org.eclipse.update.configurator_3.1.0.jar
将这些代码解压缩到一个空目录里,然后导入到Source Insight的Project里。
二、Eclipse启动过程
首先我们从Eclipse的启动过程开始分析。
1、eclipse.exe
它是Eclipse的启动文件,是与平台相关的可执行文件。它的功能比较简单,主要是加载startup.jar文件,代码在Eclipse源代码的/features/org.eclipse.platform.launchers/library目录下,对应多个平台。对于win32平台,你可以直接运行win32目录下的build.bat文件来编译得到它(需要安装C编译器)。
2、startup.jar
这个是Eclipse真正的启动文件,你可以在命令行下运行java -jar startup.jar命令来启动Eclipse。它的入口是org.eclipse.core.launcher.Main,它对应的源代码在org.eclipse.platform/src目录的子目录下的Main.java。我们从main函数往后跟踪,找到basicRun,这个是启动的主要部分。
protected void basicRun(String[] args) throws Exception {
......
setupVMProperties(); //设置VM属性
processConfiguration(); //读取configuration/config.ini配置文件
......
// need to ensure that getInstallLocation is called at least once to initialize the value.
// Do this AFTER processing the configuration to allow the configuration to set
// the install location.
getInstallLocation();
// locate boot plugin (may return -dev mode variations)
URL[] bootPath = getBootPath(bootLocation);
setSecurityPolicy(bootPath); //设置执行权限
// splash handling is done here, because the default case needs to know
// the location of the boot plugin we are going to use
handleSplash(bootPath);
invokeFramework(passThruArgs, bootPath); //启动Eclipse内核
}
这个函数前面部分是设置一些属性,最关键的是最后invokeFramework函数,它是启动Eclipse的核心。下面我们看看invokeFramework函数的具体内容。
private void invokeFramework(String[] passThruArgs, URL[] bootPath)
throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, Error, Exception, InvocationTargetException {
......
URLClassLoader loader = new StartupClassLoader(bootPath, parent);
Class clazz = loader.loadClass(STARTER); //加载
String STARTER = "org.eclipse.core.runtime.adaptor.EclipseStarter";
Method method = clazz.getDeclaredMethod("run", new Class[] {String[].class, Runnable.class}); //获得run方法
......
method.invoke(clazz, new Object[] {passThruArgs, endSplashHandler}); //调用run方法
......
}
首先创建加载器loader,它是一个URLClassLoader类型。接着加载类"org.eclipse.core.runtime.adaptor.EclipseStarter",获得其run方法,然后调用此方法。
3、OSGI启动
"org.eclipse.core.runtime.adaptor.EclipseStarter"类的源代码位于/plugins/org.eclipse.osgi/eclipseAdaptor/src/org/eclipse/core/runtime/adaptor。可见它已经位于OSGI包内,它是OSGI的启动类。
public static void startup(String[] args, Runnable endSplashHandler) throws Exception {
......
adaptor = createAdaptor(); //建立适配器
......
OSGi osgi = new OSGi(adaptor); //建立OSGI对象,这就是我们要找的东西
......
osgi.launch(); //启动OSGI
......
context = osgi.getBundleContext(); //获得已加载的Bundle的执行上下文
......
Bundle[] startBundles = loadBasicBundles(); //加载Bundle
setStartLevel(getStartLevel()); //设置启动级别
......
}
4、Eclipse固定菜单的实现类(如Project、Help等菜单)
org.eclipse.ui.internal.ide包下的WorkbenchActionBuilder.java类中的 protected void fillMenuBar(IMenuManager menuBar)方法,具体实现如下:
protected void fillMenuBar(IMenuManager menuBar) {
menuBar.add(createFileMenu()); //在菜单栏增加File菜单
menuBar.add(createEditMenu());
menuBar.add(createNavigateMenu());
menuBar.add(createProjectMenu());
menuBar.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
menuBar.add(createWindowMenu());
menuBar.add(createHelpMenu());
}
如果想去掉File菜单下的Move项可以注掉private MenuManager createFileMenu()方法中的以下语句:
// menu.add(moveAction);
Eclipse源代码分析的更多相关文章
- MonkeyRunner源代码分析之启动
在工作中由于要追求完毕目标的效率,所以很多其它是强调实战.注重招式.关注怎么去用各种框架来实现目的.可是假设一味仅仅是注重招式.缺少对原理这个内功的了解,相信自己非常难对各种框架有更深入的理解. 从几 ...
- android-plugmgr源代码分析
android-plugmgr是一个Android插件加载框架,它最大的特点就是对插件不需要进行任何约束.关于这个类库的介绍见作者博客,市面上也有一些插件加载框架,但是感觉没有这个好.在这篇文章中,我 ...
- Twitter Storm源代码分析之ZooKeeper中的目录结构
徐明明博客:Twitter Storm源代码分析之ZooKeeper中的目录结构 我们知道Twitter Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeepe ...
- 转:SDL2源代码分析
1:初始化(SDL_Init()) SDL简介 有关SDL的简介在<最简单的视音频播放示例7:SDL2播放RGB/YUV>以及<最简单的视音频播放示例9:SDL2播放PCM>中 ...
- 转:RTMPDump源代码分析
0: 主要函数调用分析 rtmpdump 是一个用来处理 RTMP 流媒体的开源工具包,支持 rtmp://, rtmpt://, rtmpe://, rtmpte://, and rtmps://. ...
- 转:ffdshow 源代码分析
ffdshow神奇的功能:视频播放时显示运动矢量和QP FFDShow可以称得上是全能的解码.编码器.最初FFDShow只是mpeg视频解码器,不过现在他能做到的远不止于此.它能够解码的视频格式已经远 ...
- UiAutomator源代码分析之UiAutomatorBridge框架
上一篇文章<UIAutomator源代码分析之启动和执行>我们描写叙述了uitautomator从命令行执行到载入測试用例执行測试的整个流程.过程中我们也描写叙述了UiAutomatorB ...
- MyBatis架构设计及源代码分析系列(一):MyBatis架构
如果不太熟悉MyBatis使用的请先参见MyBatis官方文档,这对理解其架构设计和源码分析有很大好处. 一.概述 MyBatis并不是一个完整的ORM框架,其官方首页是这么介绍自己 The MyBa ...
- hostapd源代码分析(三):管理帧的收发和处理
hostapd源代码分析(三):管理帧的收发和处理 原文链接:http://blog.csdn.net/qq_21949217/article/details/46004379 这篇文章我来讲解一下h ...
随机推荐
- Unix考古记:一个“遗失”的shell
谨以此文纪念伟大的计算机科学巨匠Ken Thompson和Dennis Ritchie,并同时向其他所有为Unix发展做出贡献的黑客致敬. 历史的尘埃 Unix作为一个举世闻名的操作系统已有40余年的 ...
- C++ 虚函数表浅析
一.背景知识(一些基本概念) 虚函数(Virtual Function):在基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数. 纯虚函数(Pure Virtual Functi ...
- 还没被玩坏的robobrowser(7)——表单操作
背景 有一些站点是需要登录之后才能抓取内容的,另外做web测试的时候登录是家常便饭. 这一节里我们就以登陆testerhome为例,讲解一下robobrowser中form的操作. 预备知识 get_ ...
- 转 MySQL问题排查工具介绍
原文链接: http://mrchenatu.com/2017/03/24/mysql-tool/ 本总结来自美团内部分享,屏蔽了内部数据与工具 知识准备 索引 索引是存储引擎用于快速找到记录的一种数 ...
- windows系统如何通过Xshell 客户端连接 linux系统(主要介绍ubuntu系统)
一. 1.查看ubuntu系统的ip地址:ifconfig 在window系统运行窗口下:ping ubuntu系统的IP地址:例如:ping 192.168.163.129 出现下述命令就是ping ...
- android check box 自定义图片
http://blog.csdn.net/competerh_programing/article/details/7417074
- 怎么在eclipse中安装svn插件
Subclipse Subclipse is an Eclipse Team Provider plug-in providing support for Subversion within th ...
- JDK1.5新特性,基础类库篇,XML增强
Document Object Model (DOM) Level 3 文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口.DO ...
- 设置 debug 版本签名与生产版本一致
debug 版本使用生产版本的签名 在开发过程中,app 直接跑到手机上,用的签名文件是 Android Studio 默认的自动生成的一个签名,与生产版本的 app 签名是不一样的.当接入华为推送的 ...
- 【006】【JVM——垃圾收集器总结】
Java虚拟机学习总结文件夹 JVM--垃圾收集器总结 垃圾收集器概览 收集算法是内存回收的方法论.垃圾收集据是内存回收的详细实现.Java虚拟机规范中对垃圾收集器应该怎样实现没有规定.不同的厂 ...