赞
踩
JDK 9中引入的Java模块化系统(Java Platform Module System,JPMS),实现了可配置的封装隔离机制,相较于之前只包含代码的JAR包,其还包括:
JDK 9之前基于类路径(ClassPath)来查找依赖,若缺失,则等程序运行到该类型的加载、链接时才会报出运行时异常
在JDK 9以后,若启用了模块化封装,模块可声明对其他模块的显式依赖,JVM在启动时验证依赖关系,若缺失则启动失败,从而避免部分由于依赖而引发的运行时异常
模块提供了更精细的可访问性控制,必须明确声明其中哪一些public的类型可以被其他哪一些模块访问
为了使可配置的封装隔离机制能够兼容传统的类路径查找机制
为了保证使用传统类路径依赖的Java程序可以不经修改地直接运行在JDK 9及以后的版本,制定以下规则
JPMS因为商业原因目前不支持在模块定义中加入版本号来管理和约束依赖,本身也不支持多版本号的概念和版本选择功能
若同一个模块发行了多个不同的版本,只能在编译打包时通过javac–module-version选择模块版本来保证依赖的正确性
所以也不支持多版本模块并存、运行时热替换、热部署模块的能力,仍须通过类加载器去实现(将OSGi和JPMS混合使用)
扩展类加载器(Extension Class Loader)被平台类加载器(Platform Class Loader)取代
平台类加载器和应用程序类加载器都不再派生自java.net.URLClassLoader
新增启动类加载器(但获取仍返回null),与平台类加载器、应用程序类加载器一同继承于jdk.internal.loader.BuiltinClassLoader,其实现了模块化架构下类加载逻辑,以及模块中资源可访问性的处理
当平台或应用程序类加载器收到类加载请求,在委派给父加载器前先判断该类能否归属到某模块中,若能则先委派给该模块的加载器完成加载
启动类加载器负责加载的模块:
平台类加载器负责加载的模块:
应用程序类加载器负责加载的模块:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。