Как директивы модуля Java влияют на доступ к отражению в модуле?

Согласно https://www.oracle.com/corporate/features/understanding-java-9-modules.html система модулей Java вводит следующие директивы:

  • экспорт, экспорт ... в
  • использует
  • обеспечивает ... с
  • открыть, открыть, открыть ... чтобы

Какое влияние (если оно есть) оказывает каждая директива на доступ внешнего модуля к внутренним элементам с использованием отражения?

Например, разрешает ли exports <package> внешним модулям доступ ко всем public, protected, private элементам экспортируемого пакета с помощью отражения? А как насчет других директив?


person Gili    schedule 26.12.2018    source источник


Ответы (1)


Я бы просто процитировал #JLS7. 7 здесь (отформатировано и классифицировано мной):

В отличие от доступа во время компиляции и доступа во время выполнения, платформа Java SE обеспечивает рефлексивный доступ через Core Reflection API (§1.4).

Подробнее о вашем вопросе, классифицированном как обычный модуль (module foo) и открытый модуль (open module bar):

Обычный модуль

Обычный модуль предоставляет отражающий доступ к типам только в тех пакетах, которые явно экспортированы или явно открыты (или и то, и другое).

  • #P5# <блочная цитата> #P6#
  • #P7# <блочная цитата> #P8# #P9#
  • #P10# <блочная цитата> #P11#

Открытый модуль

Открытый модуль предоставляет отражающий доступ к типам во всех своих пакетах, как если бы все пакеты были открыты.

  • #P13# <блочная цитата> #P14#
  • #P15# <блочная цитата> #P16#
person Naman    schedule 26.12.2018
comment
Помимо этого, uses больше относится к использованию реализации службы, а provides — к предоставлению реализации. - person Naman; 26.12.2018
comment
Отличный ответ. Есть только один раздел, который я не понимаю. Для opens X to Y почему в документации указано the code inside the module enjoys reflective access to [...] all packages in the module. Разве доступ не ограничен пакетом X? - person Gili; 27.12.2018
comment
@Gili Когда написано как module A { opens X to B; } ... Внутри модуля с использованием отражения доступны все типы / члены пакета. Но module B {requires A;} получает доступ только ко всем типам/членам package X. - person Naman; 27.12.2018