Можем ли мы установить переменные среды Java во время выполнения в Java 17?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Можем ли мы установить переменные среды Java во время выполнения в Java 17?

Сообщение Anonymous »

Я пытаюсь установить переменные среды во время выполнения с помощью отражения в приложении Java, которое переносится с Java 8 на Java 17. Я меняю переменную среды для модульного тестирования. Раньше в Java 8 я мог изменять переменные среды с помощью отражения для доступа к базовой карте в Collections.unmodifyingMap.
Однако после перехода на Java 17 я получаю следующее ошибка из-за сильной инкапсуляции системы модулей платформы Java:

java.lang.reflect.InaccessibleObjectException: невозможно сделать поле частным окончательным java.util.Map java.util.Collections$UnmodifyingMap.m доступен: модуль java.base не «открывает java.util» для безымянного модуля

Хотя я знаю, что могу использовать --add-opens java.base/java.util=ALL-UNNAMED в качестве обходного пути, я ищу лучшее решение, которое не требует изменения аргументов JVM.
Я попробовал использовать подход отражения, который работал в Java 8 и реализован в Kotlin:

Код: Выделить всё

fun setEnv(newEnv: Map) {
val unmodifiableMapClass = Collections.unmodifiableMap(mapOf()).javaClass
with(unmodifiableMapClass.getDeclaredField("m")) {
isAccessible = true
@Suppress("UNCHECKED_CAST")
get(System.getenv()) as MutableMap
}.apply {
clear()
putAll(newEnv)
}
}
Я ожидал, что смогу изменять переменные среды во время выполнения, но система модулей Java 17 предотвращает доступ к этим внутренним реализациям из-за ошибки:
java.lang.reflect.InaccessibleObjectException: невозможно сделать поле
частным окончательным java.util.Map java.util.Collections$UnmodifyingMap.m
доступным: модуль java.base не «открывает java.util» для безымянного
модуля

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

Подробнее здесь: https://stackoverflow.com/questions/792 ... in-java-17
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»