Как извлечь класс из KProperty1 в Котлине - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть следующий код:

class User : MyType {
  val address: Address? = null
  val company: Company? = null
  ...
}

class Address : MyType {
  val city: String? = null
}

class Company : MyType {
  val name: String? = null
}

var properties: MutableMap<String, Collection<KProperty1<Any, *>>>? = mutableMapOf()

fun init() {
    fillPropertiesMap(User::class.java)
}

private inline fun <reified T : Any> fillPropertiesMap(clazz: Class<T>) {
    val prop = clazz.kotlin.memberProperties
            .filter { it.visibility == KVisibility.PUBLIC } as Collection<KProperty1<Any, *>>
    fill(clazz as Class<Any>, prop)
}

fun fill(clazz: Class<Any>, props: Collection<KProperty1<Any, *>>) {
    properties[clazz.simpleName] = props
    props.forEach()
    { prop ->
        if (isMyCustomType(prop)) { 
            fillPropertiesMap(prop.????) . // how get class from KProperty1 for Address.class and Company.class
        }
    }
}

Я хочу заполнить карту KProperty1 моего класса User. Класс User имеет иерархическую структуру, и мне нужно получить весь список KProperty1 классов, которые находятся в классе User. Вопрос в том, как получить класс из KProperty1

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Я нашел решение:

fillPropertiesMap(prop.getter.returnType.javaType as Class<Any>, map)
0 голосов
/ 07 апреля 2019

Если вы хотите получить тип возврата Class (например, Address::class.java из User::address), это будет

prop.returnType.jvmErasure.java

Документы: returnType; erasure; java.

Примечание: если у вас есть reified T в fillPropertiesMap, вам не нужен аргумент Class<T>, потому что вы можете получить его как T::class.java.

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