> Можно ли изменить значение 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().

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью