使用kotlin-reflect查找数据class的属性的数据类型
Using kotlin-reflect to find the data type of data class's properties
给定一个简单的数据 class 比如:
data class TestSimple(
val country: String,
var city: String? = null,
var number: Int? = null,
var code: Long? = null,
var amount: Float? = null,
var balance: Double? = null
)
有什么方法可以使用 kotlin-reflect
来查找属性的数据类型?我通过以下方式获得了所有属性:
val allFields = this::class.declaredMemberProperties.map {
it.name to it
}.toMap()
我只得到了 allFields["number"].returnType
,其中 returns 和 KType
。我想不出一种方法来检查 KType
是 Int
还是 Long
.
我正在尝试避免使用当前用于将传入的 JSON 数字数据转换为适当数据类型的代码:
fun castToLong(value: Any): Long {
val number = try {
value as Number
} catch (e: Exception) {
throw Exception("Failed to cast $value to a Number")
}
return number.toLong()
}
首先,您可以使用一些库将 JSON 解析为实际类型。杰克逊对 Kotlin 有很好的支持。
如果您不想使用库,可以使用此代码段来确定参数类型:
import java.time.OffsetDateTime
import kotlin.reflect.KClass
import kotlin.reflect.full.declaredMemberProperties
data class UpdateTaskDto(
val taskListId: Long,
val name: String,
val description: String? = null,
val parentTaskId: Long? = null,
val previousTaskId: Long? = null,
val dateFrom: OffsetDateTime? = null,
val dateTo: OffsetDateTime? = null,
val dateOnlyMode: Boolean? = false
) {
fun test() {
this::class.declaredMemberProperties.forEach { type ->
println("${type.name} ${type.returnType.classifier as KClass<*>}")
}
}
}
作为调用测试方法的结果,我得到:
dateFrom class java.time.OffsetDateTime
dateOnlyMode class kotlin.Boolean
dateTo class java.time.OffsetDateTime
description class kotlin.String
name class kotlin.String
parentTaskId class kotlin.Long
previousTaskId class kotlin.Long
taskListId class kotlin.Long
给定一个简单的数据 class 比如:
data class TestSimple(
val country: String,
var city: String? = null,
var number: Int? = null,
var code: Long? = null,
var amount: Float? = null,
var balance: Double? = null
)
有什么方法可以使用 kotlin-reflect
来查找属性的数据类型?我通过以下方式获得了所有属性:
val allFields = this::class.declaredMemberProperties.map {
it.name to it
}.toMap()
我只得到了 allFields["number"].returnType
,其中 returns 和 KType
。我想不出一种方法来检查 KType
是 Int
还是 Long
.
我正在尝试避免使用当前用于将传入的 JSON 数字数据转换为适当数据类型的代码:
fun castToLong(value: Any): Long {
val number = try {
value as Number
} catch (e: Exception) {
throw Exception("Failed to cast $value to a Number")
}
return number.toLong()
}
首先,您可以使用一些库将 JSON 解析为实际类型。杰克逊对 Kotlin 有很好的支持。 如果您不想使用库,可以使用此代码段来确定参数类型:
import java.time.OffsetDateTime
import kotlin.reflect.KClass
import kotlin.reflect.full.declaredMemberProperties
data class UpdateTaskDto(
val taskListId: Long,
val name: String,
val description: String? = null,
val parentTaskId: Long? = null,
val previousTaskId: Long? = null,
val dateFrom: OffsetDateTime? = null,
val dateTo: OffsetDateTime? = null,
val dateOnlyMode: Boolean? = false
) {
fun test() {
this::class.declaredMemberProperties.forEach { type ->
println("${type.name} ${type.returnType.classifier as KClass<*>}")
}
}
}
作为调用测试方法的结果,我得到:
dateFrom class java.time.OffsetDateTime
dateOnlyMode class kotlin.Boolean
dateTo class java.time.OffsetDateTime
description class kotlin.String
name class kotlin.String
parentTaskId class kotlin.Long
previousTaskId class kotlin.Long
taskListId class kotlin.Long