Однако после перехода на 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
Я попробовал использовать подход отражения, который работал в 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: невозможно сделать поле частным окончательным модуль"
Я хочу избегать использования флагов --add-opens, поскольку это скорее обходной путь, чем правильное решение. Я ищу чистый альтернативный подход, который работает с моделью безопасности Java 17.
Подробнее здесь: https://stackoverflow.com/questions/792 ... -in-jdk-17
Мобильная версия