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

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

Сообщение Anonymous »

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

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

java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.util.Map java.util.Collections$UnmodifiableMap.m accessible: module java.base does not "opens java.util" to unnamed module
Хотя я знаю, что могу использовать --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: невозможно сделать поле частным окончательным модуль"
Я хочу избегать использования флагов --add-opens, поскольку это скорее обходной путь, чем правильное решение. Я ищу чистый альтернативный подход, который работает с моделью безопасности Java 17.

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

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

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

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

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

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