Kotlin reflection получить список полей

есть ли эквивалент для отражения java foo.getClass().getFields() в Котлине? Я мог только найти, что я могу получить доступ к полю, когда я знаю его имя, но я хотел бы обрабатывать поля в общем виде.

Ответ 1

Вам нужны поля как "в поле поддержки" или поля, как в "свойствах"... У Kotlin действительно есть только свойства. Вы можете получить их для некоторого класса, используя:

MyTest::class.memberProperties

// or 

MyTest::class.declaredMemberProperties

И с Java Class<T> используйте свойство расширения kotlin, чтобы получить Kotlin KClass<T>, из которого вы можете продолжить:

someClassOfMine.javaClass.kotlin.memberProperties

Для этого требуется, чтобы зависимость kotlin-reflect была добавлена ​​в вашу конструкцию и путь к классам. Вы найдете много других полезных вещей на KClass

Для секретных полей поддержки за свойством используйте отражение Java на свой страх и риск.

Ответ 2

Вы не можете сделать это в Котлине, но есть грязный ненадежный способ сделать это в java. Вы можете использовать java-отражение. Вот так:

public class TestClass {

    trait EmptyTrait
    class EmptyClass

    public var anotherVar:Int? = null
    public val contant:Float = 10f
    private var emptyTrait:EmptyTrait? = null
    val emptyClass:EmptyClass = EmptyClass()

    public fun setVal(fieldName: String, value: Int) {
        javaClass.getDeclaredField(fieldName).set(this, value);
    }

    public fun getFieldNames(): String {
        return javaClass.getDeclaredFields().map{it.getName()}.join(", ")
    }    
}

Протестируйте его:

val t = TestClass()
Log.v("MainActivity", "Fields: " + t.getFieldNames())
Log.v("MainActivity", "anotherVar: " + t.anotherVar)
t.setVal("anotherVar", 10)
Log.v("MainActivity", "anotherVar: " + t.anotherVar)

Результаты:

Fields: anotherVar, emptyClass, emptyTrait, contant, $kotlinClass
anotherVar: null
anotherVar: 10

он работает)

Ответ 3

Теперь очень легко с Kotlin v1.1, вы можете использовать следующий метод для получения полей в kotlin

val fields = MyClass.javaClass.kotlin.members

Где MyClass - это класс по вашему выбору.

Чтобы использовать это, вам необходимо включить отображение kotlin в файл сборки gradle, как показано ниже

compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"

Кроме того, также возможно получить поля из javaClass напрямую, если вам нужны java-поля (полезно в некоторых случаях, поскольку они охватывают несколько другую область)

val fields = MyClass.javaClass.declaredFields