Kotlin отражение на объекте экземпляра - PullRequest
0 голосов
/ 28 июня 2018

Я пробовал кое-что из kotlin.reflection во время моего проекта, и застрял на чем-то, что мне кажется трудным для понимания, я объявил объект следующим образом:

object WebsiteMapping
{
    const val ADMIN = "/admin"
}

раз я звоню:

Arrays
  .stream(WebsiteMapping::class.java.declaredFields)
  .forEach { field -> println(field.type) }

что я получаю:

class java.lang.String
class mapping.WebsiteMapping

Когда я немного посмотрел на то, что стоит за вызовом объявленных полей, я понял, почему он работает так, как есть, но есть ли какой-нибудь удобный способ получения только объявленных констант внутри этого объекта без получения корня всей структуры?

1 Ответ

0 голосов
/ 28 июня 2018

Поле с типом class mapping.WebsiteMapping, по сути, является не корнем структуры, а специальным полем, сгенерированным в типе объекта, который содержит ссылку на одноэлементный объект.

В Kotlin это поле называется INSTANCE по соглашению. Поэтому вы можете отфильтровать поля, полученные из класса, следующим образом:

WebsiteMapping::class.java.declaredFields
    .filter { it.name != "INSTANCE" }
    .forEach { println(it.type) }

Другим решением является переключение с java.reflect.* на API отражения Kotlin kotlin.reflect (требуется зависимость от kotlin-reflect модуля ), который автоматически фильтрует свойство:

WebsiteMapping::class.memberProperties
    .forEach { println(it.returnType) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...