Eclipse 类装入器原理
在典型的 Java 应用程序中,我们要加载一个类或资源时,通常可以使用三种类装入器:
当前类的类装入器;
当前线程的 Context 类装入器;
系统类装入器;
在实际的应用开发中比较常用到前两个类装入器是,下边重点介绍在 Eclipse 插件运行环境中前两种类装入器的结构和原理以及和典型的 Java 应用的不同之处。
当前插件类的类装入器
下图是 Eclipse 插件在运行时当前插件类的类装入器的体系结构图。
图 2 Eclipse 插件类装入器的结构
其中 EclipseClassloader 类装入器实现了 OSGi 规范的 BundleClassLoader,它用来装载 Bundle (也就是插件)中的类 OSGi ParentClassloader 类装入器是 Eclipse 插件类装入器的父类装入器,可以通过在启动 Eclipse 时设置系统属性 osgi.parentClassloader 来改变它,这个改变类会影响所有的 Eclipse 插件。如果在启动时没有设置系统属性 osgi.parentClassloader, Eclipse 使用一个默认的空的类装入器。
BundleLoader 是 EclipseClassloader 类装入器的代理,它是用来加载插件相关的资源的。
Eclipse 插件类装入器加载类或资源的过程如下:
1.首先试图从父类装入器加载类,其过程是先从 OSGi ParentClassloader 类装入器加载类,OSGi ParentClassloader 类装入器使用传统的 Java 装入器的委托模式依次从父类装入器加载类。
2.如果无法从 OSGi ParentClassloader 类装入器加载类,则试图通过代理 BundleLoader 来加载类。
3.BundleLoader 首先试图从此插件的需求依赖插件("require"指定的插件)中去加载需要的类,如果找不到,则通过 EclipseClassloader 类装入器来从插件本地加载需要的类。
4.如果还是找不到要加载的类,就会抛出类找不到异常。
当前线程的 Context 类装入器
在 Eclipse 中并没有设置 Context 类装入器,所以默认情况下当前线程的 Context 类装入器为系统的类装入器,其体系结构如 图 3 所示。
图 3 Eclipse 插件当前线程 Context 类装入器的结构
在 Eclipse 中,每个插件都有自己的类装入器,每个线程有自己的类装入器。插件和线程之间没有统一的映射关系,所以 Eclipse 框架没有将线程的 Context 类装入器设置成有意义类装入器。
不知道这是不是你想要的
|