reflection - Kotlin:使用(输出)反射比较不同目标对象的属性值

标签 reflection lambda kotlin

我想比较一个数据类的多个实例之间的值,以便我知道哪个值发生了变化:

data class A(val name : String)
val firstA = A("hello")
val secondA = A("you")

if (secondA.name.changed(firstA)) {
   // Do something
}

我可以以某种方式访问​​ .name 的属性函数吗?并在没有明确定义的情况下在另一个目标值上执行它(在本例中是在 firstA 上)?
代表可以在这里提供帮助,或者我如何在有和没有反射(reflection)的情况下解决这个问题?

最佳答案

没有反射

我找到了一种不使用反射的方法:

interface DiffValue<T> {
    val old : T?
}

fun <T,R> T.changed(memberAccess : T.() -> R) : Boolean {
    if (this is DiffValue<*>) {
        val old = this.old as? T
        if (old != null) {
            val currentValue = with(this, memberAccess)
            val previousValue = with(old, memberAccess)
            return currentValue != previousValue
        }
    }
    return true
}

这就是你如何使用它:
data class A(val val name: String, override val old : A? = null)
val firstA = A("hello")
val secondA = A("you", firstA)

if (secondA.changed {name}) {
   // Do something
}

这是基于 lambda literals with receivers 的概念允许 Kotlin 构建强大的构建器和 DSL。

注意:DiffValue interface 是可选的,仅用于使值保持在一起更容易一些并避免 changed 中的附加参数.

关于reflection - Kotlin:使用(输出)反射比较不同目标对象的属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46792185/

相关文章:

java - 尽管使用 RxJava 在另一个线程上订阅,但使用 Google 的 People API 时仍然收到 IllegalStateException

Kotlin 和有区别的联合(求和类型)

java - 使用反射获取字段的初始化值

java - new 运算符和 Class.newInstance() 有什么区别?

c# - 我可以将局部变量作为常量而不是闭包引用捕获到 LINQ 表达式中吗?

node.js - 如何在 AWS RDS 上配置 MySQL 文档存储

Java : know when a method is called

c# - Java通过反射创建通用Arraylist

java - if 语句替代 Java 8

kotlin - 如何在 kotlin 中将 get() 与支持字段一起使用