Как получить ClassLoader вновь созданного слоя JPMS? - PullRequest
0 голосов
/ 26 сентября 2018

Может быть, это простой вопрос, но все же можно найти, как это сделать.Предположим, я использую следующий код для создания слоя

ModuleFinder finder = ModuleFinder.of(moduleCPath);
ModuleLayer parent = ModuleLayer.boot();
Configuration cf = parent.configuration().resolve(finder, ModuleFinder.of(), Set.of("module-c"));
ClassLoader scl = ClassLoader.getSystemClassLoader();
ModuleLayer myLayer = parent.defineModulesWithOneLoader(cf, scl);

Как я понимаю, для myLayer был создан один загрузчик классов.Как я могу получить ссылку на этот загрузчик классов, имеющий ссылку на myLayer и не зная, какие классы могут быть внутри myLayer модулей?

1 Ответ

0 голосов
/ 26 сентября 2018

Когда создается ModuleLayer, каждый Module сопоставляется с ClassLoader.

ModuleLayer

Слой создается из графика модулей вКонфигурация и функция, отображающая каждый модуль на ClassLoader .

A ModuleLayer не имеет понятия ClassLoader, поскольку нет гарантии, что каждый Moduleбудет иметь такой же ClassLoader.Вместо этого ClassLoader ассоциируется с каждым отдельным Module, который вы можете получить через Module.getClassLoader().

Поскольку вы используете ModuleLayer.defineModulesWithOneLoader(Configuration,ClassLoader) 1 , однако, является гарантией того, что каждый Module будет иметь одинаковый ClassLoader.Это означает, что вы можете получить ClassLoader из любого Module в ModuleLayer и рассматривать его как "ClassLoader из ModuleLayer".

ModuleLayer layer = parent.defineModulesWithOneLoader(...);
ClassLoader loader = layer.modules().iterator().next().getClassLoader();

Обратите внимание, что это неработать как задумано, если:

  • ModuleLayer пусто (не имеет Module s).
    • iterator().next() сгенерирует NoSuchElementException.
  • Вы создаете ModuleLayer с помощью defineModulesWithManyLoaders(Configuration,ClassLoader) 1
    • Каждый Module будет иметь свой собственный ClassLoader.
  • Вы создаете ModuleLayer с помощью defineModules(Configuration,Function) и Function не возвращает один и тот же ClassLoader каждый раз.
    • Позволяет любую комбинацию от Module до ClassLoader.Кроме того, у каждого ClassLoader могут быть разные родители.Этот метод обеспечивает наибольшую гибкость при определении ModuleLayer с.

1.Методы defineModulesWithOneLoader и defineModulesWithManyLoaders, по сути, являются удобными методами для defineModules для двух предопределенных вариантов использования;каждый Module имеет одинаковые ClassLoader, а каждый Module имеет свои ClassLoader соответственно.

...