我想在运行时创建一个模块层配置,它由默认JRE提供的系统模块子集组成。基本上与使用jlink
可以实现的相同 - 但在运行时。
以下代码段显示了我当前的非工作解决方案的大纲。调用块看起来像:
ClassLoader loader = createCustomClassLoader("java.base", "java.logging");
assertNotNull(loader.loadClass("java.util.logging.Logger"));
assertThrows(Exception.class, () -> loader.loadClass("javax.script.ScriptEngine"));
ClassLoader工厂是:
private ClassLoader createTestClassLoader(String... rootNames) {
ModuleFinder before = ModuleFinder.of();
List<Configuration> parents = List.of(ModuleLayer.boot().configuration());
ModuleFinder after = ModuleFinder.of();
Configuration configuration = Configuration.resolve(before, parents, after, Arrays.asList(rootNames));
ClassLoader parentLoader = ClassLoader.getSystemClassLoader();
ModuleLayer configuredLayer = ModuleLayer.boot().defineModulesWithOneLoader(configuration, parentLoader);
ClassLoader classLoader = configuredLayer.findLoader(rootNames[rootNames.length-1]);
assertNotNull(classLoader); // classLoader is null (***)
classLoader.setDefaultAssertionStatus(true); // -ea
return classLoader;
}
系统模块的屏蔽是否可以在运行时使用?如果是,怎么样?