不积跬步,无以至千里;不积小流,无以成江海。——荀子
引导语
JDK9引入模块化系统,同时类加载器不再遵循双亲委派模型,发生了些变化,下面一一道来。
1 模块下的类加载器
JDK9之前,JDK1.2以来,类加载其遵循:三层类加载器架构和双亲委派模型。
模块化系统的施行,类加载器发生了变化:
1. 扩展类加载器(Extension ClassLoader)被平台类加载器(Platform ClassLoader)取代。同时整个JDK都基于模块化进行构建(其中原来的rt.jar和tools.jar被拆分成数十个JMOD文件),其中的Java类库已满足了可扩展的需求,所以无须再保留\lib\ext目录,之前使用这个目录或者java.ext.dirs系统变量来扩展JDK功能的机制已经没用存在的价值了。
新版本JDK中同时取消了\jre目录,因为随时可以组合构建出程序运行所需的JRE,举例:
只使用java.base模块中的类型,组合JRE
jlink -p $JAVA_HOME/jmods --add-modules java.base --output jre
2. 平台类加载器和应用程序类加载器都不再派生自java.net.URLClassLoader,如果有程序直接依赖了这种继承关系,或者依赖了URLClassLoader类的特定方法&#