Однако после перехода на 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.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
Мобильная версия