Как директивы модуля 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
)Рефлексивный доступ, предоставляемый типам в открытых пакетах модуля (независимо от того, экспортированы они или нет), относится ко всем типам в этих пакетах и ко всем членам этих типов.
Не предоставляется рефлексивного доступа к типам или их элементам в пакетах, которые не экспортируются и не открываются.
внутри модуля
Код внутри модуля имеет рефлексивный доступ ко всем типам и всем их элементам во всех пакетах модуля.
Открытый модуль
Открытый модуль предоставляет отражающий доступ к типам во всех своих пакетах, как если бы все пакеты были открыты.
открытые пакеты модуля
Для кода вне открытого модуля рефлексивный доступ, предоставляемый типам в открытых пакетах модуля (то есть всем пакетам в модуле), относится ко всем типам в этих пакетах и ко всем членам этих типов.
внутри модуля
Код внутри модуля имеет отражающий доступ ко всем типам и всем их членам во всех пакетах модуля.