Получение списка получателей (или методов или свойств) в общем классе с помощью Kotlin - PullRequest
0 голосов
/ 07 сентября 2018

Я не могу понять, как мне поступить с дженериками в 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 получателями, я хочу назвать все эти 10 получателей в originalBean, и сравнить его значение с значениями в modifiedBean.Если отличается, я напишу это в моем ChangeHistory

Спасибо

1 Ответ

0 голосов
/ 07 сентября 2018

Вы должны убедиться, что сам T не является обнуляемым типом, т. Е. Использовать что-то вроде 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 относительно отражения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...