
JDK9开始引入,目的:为了能够实现模块化的关键目标:可配置的封装隔离机制。
可配置的封装隔离机制主要解决:
JDK 9的模块不仅仅像之前的JAR包那样只是简单地充当代码的容器,除了代码外,Java的模块定义还包含以下内容:
为了使可配置的封装隔离机制能够兼容传统的类路径查找机制,JDK 9提出了“模块路径”(ModulePath)的概念。
模块化系统将按照以下规则来保证使用传统类路径依赖的Java程序可以不经修改地直接运行在 JDK 9及以后的Java版本上:
java --list-modules,会得到明确带着版本号的模块列表:java.base@13.0.2
java.compiler@13.0.2
java.datatransfer@13.0.2
java.desktop@13.0.2
java.instrument@13.0.2
java.logging@13.0.2
java.management@13.0.2
java.management.rmi@13.0.2
java.naming@13.0.2
java.net.http@13.0.2
......
OSGi – JPMS互操作性概念验证
为了保证兼容性,JDK 9并没有从根本上动摇从JDK 1.2以来运行了二十年之久的三层类加载器架构以及双亲委派模型。
模块化下的类加载器仍然发生了一些应该被注意到变动,主要包括以下几个方面:
java.net.URLClassLoaderjdk.internal.loader.BuiltinClassLoader![]() | ![]() |
|---|---|
JDK9中虽然仍然维持着三层类加载器和双亲委派的架构,但类加载的委派关系也发生了变动。
当平台及应用程序类加载器收到类加载请求,在委派给父加载器加载前,要先判断该类是否能够归属到某一个系统模块中,如果可以找到这样的归属关系,就要优先委派给负责那个模块的加载器完成加载,也许这可以算是对双亲委派的第四次破坏。
在Java模块化系统明确规定了三个类加载器负责各自加载的模块,即前面所说的归属关系
java.base java.datatransfer
java.desktop java.instrument
java.logging java.management
java.management.rmi java.naming
java.prefs java.rmi
java.security.sasl java.xml
jdk.httpserver jdk.internal.vm.ci
jdk.management jdk.management.agent
jdk.naming.rmi jdk.net
jdk.unsupported jdk.sctp
java.activation* java.compiler*
java.scripting java.se
java.se.ee java.corba*
java.security.jgss java.smartcardio
java.sql.rowset java.xml.bind*
java.xml.crypto java.xml.ws*
java.xml.ws.annotation* java.transaction*
jdk.accessibility jdk.charsets
jdk.crypto.cryptoki jdk.crypto.ec
jdk.dynalink jdk.incubator.httpclient
jdk.internal.vm.compiler* jdk.jsobject
jdk.localedata jdk.naming.dns
jdk.scripting.nashorn jdk.security.auth
jdk.security.jgss jdk.xml.dom
jdk.zipfs java.sql
jdk.aot jdk.attach
jdk.compiler jdk.editpad
jdk.hotspot.agent jdk.internal.ed
jdk.internal.jvmstat jdk.internal.le
jdk.internal.opt jdk.jartool
jdk.javadoc jdk.jcmd
jdk.jconsole jdk.jdeps
jdk.jdi jdk.jdwp.agent
jdk.jlink jdk.jshell
jdk.jstatd jdk.pack
jdk.policytool jdk.rmic
jdk.scripting.nashorn.shell jdk.xml.bind*
jdk.xml.ws*