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

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

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

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

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

1 ответ

Решение

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

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

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

Нормальный модуль

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

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

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

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

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

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

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

    Код внутри модуля имеет рефлексивный доступ ко всем типам и всем их элементам во всех пакетах модуля.

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

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

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

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

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

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

Другие вопросы по тегам