Получить текущее значение параметра `-illegal-access` в Java - PullRequest
0 голосов
/ 15 декабря 2018

В этой статье, JDK 9: Предложение разрешить нелегальный доступ с отражением по умолчанию , утверждается, что опция –permit-illegal-access будет заменена более общей опцией, –illegal-access.

  • –illegal-access=permit
  • –illegal-access=warn
  • –illegal-access=debug
  • –illegal-access=deny

➥ Сделаночто случилось?Есть ли настройка –illegal-access?

➥ Как они установлены?Аргументы для запуска JVM?

➥ Как получить текущее значение во время выполнения?

1 Ответ

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

Это случилось?Есть ли параметр –illegal-access?

Да, похоже, что это произошло - по крайней мере, для OpenJDK / OracleJDK.Опция указана в документации для java «инструмента».

Она также указана при выполнении java --help-extra.

Примечание: JDK-В документации упоминается, что эта опция будет удалена в следующем выпуске.


Как они установлены?Аргументы в пользу запуска JVM?

Да, это опция командной строки.Пример:

java --illegal-access=deny --module-path <path> --module <module>/<main-class> [args...]

Как получить текущее значение во время выполнения?

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


Для удобства вот документация --illegal-access для JDK-11:

- недопустимый доступ = параметр

При наличии во время выполнения, --illegal-access= принимает ключевое слово parameter, чтобы указать режимоперации:

Примечание:

Эта опция будет удалена в следующем выпуске.

  • permit: Эторежим открывает каждый пакет в каждом модуле в образе времени выполнения для кодирования во всех безымянных модулях (например, код в пути к классам), если этот пакет существовал в JDK 8. Это обеспечивает как статический доступ (например, с помощью скомпилированного байт-кода)и глубокий рефлексивный доступ) через различные API рефлексии платформы.Первая операция отражающего доступа к любому такому пакету вызывает предупреждение.Тем не менее, после первого появления предупреждения не выдаются.Это единственное предупреждение описывает, как включить дальнейшие предупреждения.Этот режим используется по умолчанию для текущего JDK, но изменится в следующем выпуске.

  • warn: этот режим идентичен permit за исключением того, что для каждого сообщения выдается предупреждениенедопустимая операция отражающего доступа.

  • debug: этот режим идентичен warn за исключением того, что для каждой недопустимой операции отраженного доступа выдается как предупреждающее сообщение, так и трассировка стека.

  • deny: этот режим отключает все операции с несанкционированным доступом, кроме тех, которые включены другими параметрами командной строки, такими как --add-opens.Этот режим станет режимом по умолчанию в будущем выпуске.

Режим по умолчанию, --illegal-access=permit, предназначен для того, чтобы вы знали о коде на пути к классам, который рефлексивно обращается к любому внутреннему JDKAPI хотя бы один раз.Чтобы узнать обо всех таких доступах, вы можете использовать режимы warn или debug.Для каждой библиотеки или инфраструктуры на пути к классам, для которых требуется недопустимый доступ, у вас есть два варианта:

  • Если сопровождающие компонента уже выпустили фиксированную версию, которая больше не использует внутренние API JDK, тогдаВы можете рассмотреть возможность обновления до этой версии.

  • Если компонент все еще нуждается в исправлении, то вы можете связаться с его сопровождающими и попросить их заменить использование им внутренних API-интерфейсов JDK на соответствующиеэкспортированные API.

Если вам необходимо продолжать использовать компонент, требующий несанкционированного доступа, вы можете исключить предупреждающие сообщения, используя одну или несколько опций --add-opens, чтобы открывать только эти внутренние пакеты.к которому требуется доступ.

Чтобы убедиться, что ваше приложение готово к будущей версии JDK, запустите его с --illegal-access=deny вместе со всеми необходимыми опциями --add-opens.Любые оставшиеся ошибки недопустимого доступа, скорее всего, будут связаны со статическими ссылками из скомпилированного кода на внутренние API JDK.Вы можете определить их, запустив инструмент jdeps с опцией --jdk-internals.Из соображений производительности текущий JDK не выдает предупреждений о недопустимых операциях статического доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...