在equinox中,框架的ClassLoader为org.eclipse.equinox.launcher.Main$StartupClassLoader。
StartupClassLoader是在org.eclipse.equinox.launcher.Main类中进行实例化的。
这一点,可以通过反编译org.eclipse.equinox.launcher_1.0.100.v20080509-1800.jar看到。
如下是通过Java Decompiler工具反编译后结果:
//StartupClassLoader
private class StartupClassLoader extends URLClassLoader
{
public StartupClassLoader(URL[] paramArrayOfURL)
{
super(paramArrayOfURL);
}
public StartupClassLoader(URL[] paramArrayOfURL, ClassLoader paramClassLoader) {
super(paramArrayOfURL, parent);
}
public StartupClassLoader(URL[] paramArrayOfURL, ClassLoader paramClassLoader, URLStreamHandlerFactory paramURLStreamHandlerFactory) {
super(paramArrayOfURL, paramClassLoader, paramURLStreamHandlerFactory);
}
protected String findLibrary(String name) {
if (Main.this.extensionPaths == null)
return super.findLibrary(name);
String libName = System.mapLibraryName(name);
for (int i = 0; i < Main.this.extensionPaths.length; ++i) {
File libFile = new File(Main.this.extensionPaths[i], libName);
if (libFile.isFile())
return libFile.getAbsolutePath();
}
return super.findLibrary(name);
}
}
//启动框架,实例化框架类加载器
private void invokeFramework(String[] passThruArgs, URL[] bootPath) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, Error, Exception, InvocationTargetException
{
String type = System.getProperty("osgi.frameworkParentClassloader", System.getProperty("osgi.parentClassloader", "boot"));
ClassLoader parent = null;
if ("app".equalsIgnoreCase(type)) {
parent = ClassLoader.getSystemClassLoader();
} else if ("ext".equalsIgnoreCase(type)) {
ClassLoader appCL = ClassLoader.getSystemClassLoader();
if (appCL != null)
parent = appCL.getParent();
} else if ("current".equalsIgnoreCase(type)) {
parent = super.getClass().getClassLoader(); }
URLClassLoader loader = new StartupClassLoader(bootPath, parent);//实例化StartupClassLoader
Class clazz = loader.loadClass("org.eclipse.core.runtime.adaptor.EclipseStarter");//反射执行的EclipseStarter类的run方法
Method method = clazz.getDeclaredMethod("run", new Class[] { [Ljava.lang.String.class, Runnable.class });
try {
method.invoke(clazz, new Object[] { passThruArgs, this.splashHandler });
} catch (InvocationTargetException e) {
if (e.getTargetException() instanceof Error)
throw ((Error)e.getTargetException());
if (e.getTargetException() instanceof Exception) {
throw ((Exception)e.getTargetException());
}
throw e;
}
}
通过调试,发现大约有288个类是交由此加载器来进行加载的。这些类是框架实现的核心类。