new关键字发生了什么系列补充(OSGi类加载机制)

前言

OSGi是基于Java语言的动态模块化规范

特点:

  • 模块划分、可见性控制更精确
  • 模块级热插拔

0x01 基础知识

Bundle:OSGi中的每个模块称为Bundle,与普通java类库区别不大,都通过jar格式封装,内存存储java package和class。一个Bundle可以生命它所依赖的java package(Import-Package),也可以声明它允许导出发布的java package(Export-Package)

依赖关系:Bundle之间的依赖关系从上层模块依赖底层模块->平级模块之间的依赖,只有Export的Package才能由外界访问,其他会隐藏起来。

热插拔:实现程序模块级的热插拔功能,可以只停用、重新安装然后启用程序中的其中一部分

0x02 Bundle类加载器规则

没有固定的委派关系

某个Bunlde A声明了一个它依赖的Bundle B的Package,如果Bundle B声明发布了这个Package,那么对这个Bundle B的Package的类加载动作都会委派给发布它的Bundle B类加载器去完成

只有使用某个Package或Class的使用,Bundle之间才存在委派和依赖关系,其余时间平级

类加载查找规则

  • 以java.*开头的类,委派给父类加载器加载
  • 否则,委派列表名单内的类,委派给父类加载器加载
  • 否则,Import列表中的类,委托给Export这个类的Bundle类加载器去加载
  • 否则,查找当前Bundle的Classpath,使用自己的类加载器加载
  • 否则,查找是否在自己的Fragment Bundle中,如果是,则委派给Fragment Bundle的类加载器加载
  • 否则,查找Dynamic Import列表的Bundle,委派给对应Bundle的类加载器
  • 否则,类加载失败

你可能感兴趣的:(jvm,new关键字发生了什么)