class Delegate {
    val name: String = "default"

    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "getValue"
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$value 已被赋值给 ${property.name}$thisRef")
    }
}

class Example() {
    var name: String by Delegate()
}

fun main() {
    val e = Example()
    println(e.name) // getValue
    e.name = "hello" // hello 已被赋值给 name 于 org.example.Example@27973e9b
}
  1. KProperty<*>  是表示属性元数据的接口,它包含了属性的名称、类型、注解等信息。
  2. thisRef  指向Example类的实例。
  3. getValue 返回值是String是因为在这个例子中,name 属性是 String属性类型与  getValue  返回值类型必须一致。