Использование kotlin-рефлекса для поиска типа данных свойств класса данных - PullRequest
0 голосов
/ 01 февраля 2019

Учитывая простой класс данных, такой как:

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, который возвращает 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()
}

1 Ответ

0 голосов
/ 01 февраля 2019

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