模块层(ModuleLayer)让运行时可以创建彼此隔离的模块集合。这篇用同一个模块的两个版本做实验,验证隔离、exports 与服务查找(模块系统的静态部分见前面 Java 模块系统一篇,URLClassLoader 插件见上一篇)。
启动层(boot layer)的模块数 = 62,父层 = [];greeter 在启动层里吗:false
Main 所在的模块:unnamed module @85ede7b,isNamed = false,getLayer() = null(类路径上的代码在未命名模块里,不属于任何层)
新建层(从 mods1 目录解析 greeter v1):模块 = [greeter],父层 = [boot],层里的模块的类加载器 = jdk.internal.loader.Loader,与应用类加载器相同吗:false
Module.getLayer() == 新层:true;boot.findModule("greeter") 仍然是 false 层里的 greeter:Greeter.version() = 1,greet("ann") = v1 greets ann,类加载器 = Loader@12e…
层里的 greeter:Greeter.version() = 2,greet("ann") = v2 greets ann,类加载器 = Loader@476…
两个层里的 greet.Greeter 是同一个类吗:false;两个版本同时在一个 JVM 里运行Class.forName(module, "internal.Util") 能找到类:true 反射调用未导出包 internal 里的 Util.tag() → IllegalAccessException: class Main cannot access class internal.Util (in module greeter) because module greeter does not export internal to unnamed module @254989ff greeter 是否导出了 greet 包给所有模块:true;是否导出 internal:false ServiceLoader.load(layer, Service) 找到的实现:greet.Impl → hello from greeter v1, internal says util-v1
同一份模块再创建一个层:两个层里的 greeter 模块是同一个 Module 对象吗:false 解析一个不存在的模块 → FindException: Module nosuchmodule not found