Kotlin Делегаты основаны на хранении объекта делегата и делегировании ему получения / настройки изменений. Таким образом, можно встроить вызовы getValue
при доступе к делегированной переменной.
Например:
import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty
object Delegate : ReadOnlyProperty<Any?, Int> {
override fun getValue(thisRef: Any?, property: KProperty<*>): Int = 42
}
fun main() {
val foo by Delegate
println(foo)
}
Основной метод в Java будет выглядеть так:
static final KProperty[] $$delegatedProperties = new KProperty[]{(KProperty)Reflection.property0(new PropertyReference0Impl(Reflection.getOrCreateKotlinPackage(MainKt.class, "123"), "foo", "<v#0>"))};
public static void main() {
System.out.println(Delegate.INSTANCE.getValue(null, $$delegatedProperties[0]));
}
Как видите, доступ к переменной заменяется вызовом getValue
.