Как директивы модуля Java влияют на доступ к отражению в модуле? - PullRequest
0 голосов
/ 26 декабря 2018

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

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

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

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

1 Ответ

0 голосов
/ 26 декабря 2018

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

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

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

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

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

  • экспортированные пакеты модуля (exports com.example.foo.bar)

    Для кода вне обычного модуля , доступ с отражением предоставленк типам в экспортированных (и не открытых) пакетах модуля относится конкретно к public и protected ty p es в этих пакетах и ​​public и protected членов из этих типов.

  • открытых пакетов модуля (opens com.example.foo.internal to com.example.bar)

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

    Не предоставляется рефлексивного доступа к типам или их элементам в пакетах, которые не экспортируются и не открываются .

  • внутри модуля

    Код внутри модуля имеет отражающий доступ ко всем типам, а всеих члены во всех пакетах в модуле .

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

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

  • открытые пакеты модуля

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

  • внутри модуля

    Код внутри модуля имеет отражающий доступ ко всем типам и всем ихчлены, во всех пакетах в модуле .

...