Помимо понимания доступа между модулями и их соответствующими пакетами. Я считаю, что суть этого заключается в модульной системе # Relaxed-strong-encapsulation, и я бы просто выбрал соответствующие части, чтобы попытаться ответить на вопрос.
Что определяет незаконный светоотражающий доступ и какие обстоятельства вызывают предупреждение?
Чтобы облегчить переход на Java-9, можно ослабить строгую инкапсуляцию модулей.
Реализация может обеспечивать статический доступ , то есть с помощью скомпилированного байт-кода.
Может предоставлять средства для вызова своей исполняющей системы с одним или несколькими пакетами одного или нескольких ее модулей, открытых для кода во всех безымянных модулях , то есть для кода в пути к классам. Если система времени выполнения вызывается таким образом, и если при этом некоторые вызовы API-интерфейсов отражения завершаются успешно, в противном случае они потерпели бы неудачу.
В таких случаях вы фактически закончили тем, что сделали рефлексивный доступ, который является «незаконным», поскольку в чисто модульном мире вы не должны были делать такие доступы.
Как все это связано и что вызывает предупреждение в каком сценарии?
Это ослабление инкапсуляции контролируется во время выполнения с помощью новой опции запуска, --illegal-access
которая по умолчанию в Java9 равна permit
. В permit
режиме гарантирует
Первая операция отражающего доступа к любому такому пакету вызывает выдачу предупреждения, но после этого предупреждения не выдаются. Это единственное предупреждение описывает, как включить дополнительные предупреждения. Это предупреждение нельзя подавить.
Режимы конфигурируются значениями debug
(сообщение, а также трассировка стека для каждого такого доступа), warn
(сообщение для каждого такого доступа) и deny
(отключает такие операции).
Вот несколько вещей, которые нужно отлаживать и исправлять в приложениях:
- Запустите его с,
--illegal-access=deny
чтобы узнать и избежать открытия пакетов от одного модуля к другому без объявления модуля, включая такую директиву ( opens
) или явного использования --add-opens
аргумента VM arg.
- Статические ссылки из скомпилированного кода на внутренние API JDK могут быть идентифицированы с помощью
jdeps
инструмента с --jdk-internals
опцией
Предупреждающее сообщение, выдаваемое при обнаружении недопустимой операции отражающего доступа, имеет следующую форму:
WARNING: Illegal reflective access by $PERPETRATOR to $VICTIM
где:
$PERPETRATOR
- это полное имя типа, содержащего код, который вызвал рассматриваемую рефлексивную операцию, плюс источник кода (т. е. путь к JAR-файлу), если он доступен, и
$VICTIM
это строка, описывающая член, к которому осуществляется доступ, включая полное имя включающего типа
Вопросы для такого образца предупреждения: = JDK9: Произошла недопустимая операция отражающего доступа. org.python.core.PySystemState
Последнее и важное замечание: при попытке гарантировать, что вы не столкнетесь с такими предупреждениями и будете в безопасности в будущем, все, что вам нужно сделать, это убедиться, что ваши модули не делают эти незаконные отражающие доступы. :)