深入探索JVM类加载机制 —Java模块化系统

Java模块化系统

在JDK 9中引⼊的Java模块化系统(Java Platform Module System,JPMS)是对Java技术的⼀次重要升级,为了能够实现模块化的关键⽬标——可配置的封装隔离机制,Java虚拟机对类加载架构也做出了相应的变动调整,才使模块化系统得以顺利地运作。JDK 9的模块不仅仅像之前的JAR包那样只是简单地充当代码的容器,除了代码外,Java的模块定义还包含以下内容:

·依赖其他模块的列表。

·导出的包列表,即其他模块可以使⽤的列表。

·开放的包列表,即其他模块可反射访问模块的列表。

·使⽤的服务列表。

·提供服务的实现列表。

模块的兼容性:

为了使可配置的封装隔离机制能够兼容传统的类路径查找机制,JDK 9提出了与“类路

径”(ClassPath)相对应的“模块路径”(ModulePath)的概念。简单来说,就是某个类库到

底是模块还是传统的JAR包,只取决于它存放在哪种路径上。只要是放在类路径上的JAR

⽂件,⽆论其中是否包含模块化信息(是否包含了module-info.class⽂件),它都会被当

作传统的JAR包来对待; 相应地,只要放在模块路径上的JAR⽂件,即使没有使⽤JMOD

后缀,甚⾄说其中并不包含module-info.class⽂件,它也仍然会被当作⼀个模块来对待。

模块化系统将按照以下规则来保证使用传统类路径依赖的Java程序可以不经修改地直接运行在 JDK 9及以后的Java版本上,即使这些版本的JDK已经使用模块来封装了Java SE的标准类库,模块化系 统的这套规则也仍然保证了传统程序可以访问到所有标准类库模块中导出的包。

·JAR⽂件在类路径的访问规则: 所有类路径下的JAR⽂件及其他资源⽂件,都被视为⾃动

打包在⼀个匿名模块(Unnamed Module)⾥,这个匿名模块⼏乎是没有任何隔离的,它

可以看到和使⽤类路径上所有的包、JDK系统模块中所有的导出包,以及模块路径上所有

模块中导出的包。

·模块在模块路径的访问规则: 模块路径下的具名模块(Named Module)只能访问到它依赖

定义中列明依赖的模块和包,匿名模块⾥所有的内容对具名模块来说都是不可⻅的,即具

名模块看不⻅传统JAR包的内容。

·JAR⽂件在模块路径的访问规则: 如果把⼀个传统的、不包含模块定义的JAR⽂件放置到

模块路径中,它就会变成⼀个⾃动模块(Automatic Module)。尽管不包含moduleinfo.class,但⾃动模块将默认依赖于整个模块路径中的所有模块,因此可以访问到所有模块导出的包,⾃动模块也默认导出⾃⼰所有的包。

以上3条规则保证了即使Java应用依然使用传统的类路径,升级到JDK 9对应用来说几乎(类加载 器上的变动还是可能会导致少许可见的影响,将在下节介绍)不会有任何感觉,项目也不需要专门为 了升级JDK版本而去把传统JAR包升级成模块。

模块化下的类加载器

为了保证兼容性,JDK 9并没有从根本上动摇从JDK 1.2以来运行了二十年之久的三层类加载器架 构以及双亲委派模型。但是为了模块化系统的顺利施行,模块化下的类加载器仍然发生了一些应该被 注意到变动,主要包括以下几个方面。

扩展类加载器(Extension Class Loader)被平台类加载器(Platform Class Loader)取代。 这其实是⼀个很顺理成章的变动,既然整个JDK都基于模块化进⾏构建(原来的rt.jar和tools.jar被拆分成数⼗个JMOD⽂件),其中的Java类库就已天然地满⾜了可扩展的需求,那⾃然⽆须再保留 <JAVA_HOME>\lib\ext⽬录,此前使⽤这个⽬录或者java.ext.dirs系统变量来扩展JDK功能的机制已经没有继续存在的价值了,⽤来加载这部分类库的扩展类加载器也完成了它的历史使命。

其次,平台类加载器和应用程序类加载器都不再派生自java.net.URLClassLoader,如果有程序直接 依赖了这种继承关系,或者依赖了URLClassLoader类的特定方法,那代码很可能会在JDK 9及更高版 本的JDK中崩溃。现在启动类加载器、平台类加载器、应用程序类加载器全都继承于 jdk.internal.loader.BuiltinClassLoader,在BuiltinClassLoader中实现了新的模块化架构下类如何从模块中 加载的逻辑,以及模块中资源可访问性的处理。

 

JDK 9中虽然仍然维持着三层类加载器和双亲委派的架构,但类加载的委派关系也发生了 变动。当平台及应用程序类加载器收到类加载请求,在委派给父加载器加载前,要先判断该类是否能 够归属到某一个系统模块中如果可以找到这样的归属关系,就要优先委派给负责那个模块的加载器 完成加载,也许这可以算是对双亲委派的第四次破坏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值