Ответ 1
Идеальный способ разрешить это будет
сообщить об этом разработчикам org.python.core.PySystemState
и попросить их исправить такой рефлексивный доступ в будущем.
Если режим по умолчанию разрешает незаконный доступ к зеркалированию, необходимо сделать так, чтобы люди не удивлялись, когда это больше не режим по умолчанию в будущей версии.
Из одного из потоков в списке рассылки:
--illegal-access=permit
Это будет режим по умолчанию для JDK 9. Он открывает каждый пакет в каждый явный модуль для кодирования во всех неназванных модулях, то есть код на путь класса, так же, как
--permit-illegal-access
.Первая незаконная операция с рефлексивным доступом вызывает предупреждение выдается, как и с
--permit-illegal-access
, но никаких предупреждений не выдается после этого пункт. В этом единственном предупреждении будет описано, как включить дальнейшие предупреждения.
--illegal-access=deny
Это отключает все незаконные операции с рефлексивным доступом, кроме которые активируются другими параметрами командной строки, такими как
--add-opens
. Этот станет стандартным режимом в будущей версии.
Предупреждающие сообщения в любом режиме можно избежать, как и прежде, разумным использованием опций --add-exports
и --add-opens
.
Следовательно, текущим временным решением является использование --add-exports
в качестве аргументов виртуальной машины, как указано в docs:
--add-exports module/package=target-module(,target-module)*
Обновляет модуль до
export
пакета доtarget-module
, независимо от того, объявление модуля.target-module
может быть всем без имени для экспорта в все неназванные модули.
Это позволит target-module
получить доступ ко всем общедоступным типам в package
. Если вы хотите получить доступ к внутренним классам jdk, которые все еще будут инкапсулированы, вам нужно будет разрешить глубокое отражение с помощью аргумента --add-opens
как:
--add-opens module/package=target-module(,target-module)*
Обновляет модуль до
open
пакета доtarget-module
, независимо от модуля декларация.
В вашем случае, чтобы получить доступ к java.io.Console
, вы можете просто добавить это как опцию VM -
--add-opens java.base/java.io=ALL-UNNAMED
Также обратите внимание на тот же поток, что и ссылка выше
Когда deny
становится режимом по умолчанию, я ожидаю, что permit
останется поддерживаемым хотя бы для одной версии, чтобы разработчики могли продолжать переносить свой код. Режимы permit
, warn
и debug
со временем будут удалены, как и сама опция --illegal-access
.
Поэтому лучше изменить реализацию и следовать идеальному решению.