> Можно ли изменить значение val в дата классе через рефлексию (Kotlin, Android)
Уровень: senior · Роль: mobile · Категория: Технические вопросы
Компании: TrendTech
Стек: Kotlin, Android
> Пример ответа
Да, изменить значение val в дата-классе через рефлексию можно, хотя это нарушает принцип неизменяемости. В Kotlin val компилируется в private final поле, но рефлексия позволяет обойти модификатор final.
Пример:
data class Person(val name: String) fun main() { val person = Person("Alice") val field = Person::class.memberProperties.find { it.name == "name" } (field as? KMutableProperty<*>)?.setter?.call(person, "Bob") println(person) // Person(name=Bob) }
Однако в большинстве случаев поле val компилируется как final, и прямой вызов setter может выбросить исключение. Более надёжный способ - работать с Java-рефлексией:
val field = Person::class.java.getDeclaredField("name") field.isAccessible = true field.set(person, "Bob")
Важно: такой подход не рекомендуется в production-коде, так как:
- Нарушает контракт неизменяемости.
- Может привести к непредсказуемому поведению (например, при использовании в коллекциях или кэшах).
- В некоторых версиях Kotlin или с оптимизациями (inline-классы, JIT) может не сработать.
Лучше перепроектировать код, используя var или copy().
> Похожие задачи по mobile
Как проверить тип параметра в обобщённом методе Kotlin
Что такое contracts в Kotlin и когда их используют?
В каких случаях использовать модификаторы in и out в дженериках Kotlin
Что такое дефолтный поток в Kotlin Coroutines?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью