如何在运行时屏蔽系统模块?

时间:2018-02-17 20:13:33

标签: java-9 java-module

我想在运行时创建一个模块层配置,它由默认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;
}

系统模块的屏蔽是否可以在运行时使用?如果是,怎么样?

0 个答案:

没有答案