No puedo imaginar cómo debo hacer frente a los genéricos en Kotlin.
Estoy escribiendo una clase de historia para los cambios realizados en los objetos genéricos, que deben recibir cualquier tipo de clase como parámetro: después de eso, me gustaría comparar los viejos valores de los objetos con los nuevos valores de los objetos, y si he encontrado una diferencia, voy escribir que en mi clase de datos.
He succedeed hacer eso con Java con bean.getClass().getMethods();
, pero quiero tratar de movimiento para 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?
}
}
En realidad estoy atascado aquí: ¿cómo debe obtener todos los captadores en mi T
objeto?
Vamos a supongo que voy a recibir una clase que con 10 captadores, quiero llamar a todos estos 10 captadores en originalBean
, y comparando su valor con los que está en modifiedBean
. Si es diferente, la escribiré en miChangeHistory
Gracias
Usted necesita asegurarse de que T
en sí mismo no es un tipo anulable, es decir, algo así como el uso where T : Any
de la declaración de la clase, por ejemplo:
class ChangeHistoryUtils<T> (originalBean : T, username : String , modifiedBean: T? = null) where T : Any
Si lo hace después de que usted puede simplemente tener acceso a los métodos como lo hizo en Java, por ejemplo, si sólo desea volver a utilizar el código que ya tiene:
fun compareBeans(){
originalBean::class.java.methods // this is actually your originalBean.getClass().getMethods() !
// just print the methods for now...
.forEach(::println)
}
Pero a medida que está utilizando Kotlin es posible que en lugar que desee utilizar el enfoque Kotlin entonces, por ejemplo, sólo mostrar las propiedades, o similar:
originalBean::class.memberProperties
// again just printing them:
.forEach(::println)
A continuación, deberá añadir kotlin-reflect
como dependencia. También es posible que desee comprobar la referencia Kotlin con respecto a la reflexión .