OSGI框架自身的ClassLoader

  OSGI中,框架通常会为其实现的类建立一个单独的ClassLoader。
在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个类是交由此加载器来进行加载的。这些类是框架实现的核心类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值