使用Kotlin在通用类中获取吸气剂(或方法或属性)列表

时间:2018-09-07 10:57:28

标签: java kotlin

我不知道如何在Kotlin中处理泛型。

我正在编写一个用于对通用对象进行更改的历史记录类,该类应该获取任何类型的类作为参数:之后,我将比较旧对象值与新对象值,如果发现差异,我将其写在我的数据类中。

我已经成功地使用Java bean.getClass().getMethods();来做到这一点,但是我想尝试迁移到Kotlin。

class ChangeHistoryUtils<T> (val originalBean : T, username : String , var modifiedBean: T? = null) {

    data class ChangeHistory(val username: String, val fieldName : String,
                    val oldValue : String , val newValue : String , val date : LocalDate = LocalDate.now())

    fun compareBeans(){
        //how to get all originalBean getters and its values?
    }
}

我实际上被困在这里:应该如何在我的T对象中获取所有吸气剂?

让我们猜测我将收到一个包含10个getter的类,我想在originalBean中调用所有这10个getter,并将其值与modifiedBean中的值进行比较。如果不同,我将其写在ChangeHistory

谢谢

1 个答案:

答案 0 :(得分:4)

您需要确保T本身不是可为null的类型,即在类声明中使用类似where T : Any之类的内容,例如:

class ChangeHistoryUtils<T> (originalBean : T, username : String , modifiedBean: T? = null) where T : Any

如果这样做,您以后可以像在Java中那样访问方法。如果您只想重用已有的代码,

fun compareBeans(){
  originalBean::class.java.methods // this is actually your originalBean.getClass().getMethods() !
                   // just print the methods for now...
                            .forEach(::println)
}

但是当您使用Kotlin时,您可能宁愿使用Kotlin方法,例如仅显示属性或类似内容:

originalBean::class.memberProperties
             // again just printing them:
                       .forEach(::println)

然后,您需要添加kotlin-reflect作为依赖项。您可能还需要检查Kotlin reference regarding reflection