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

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

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

 MyTest::class.memberProperties // or MyTest::class.declaredMemberProperties 

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

 someClassOfMine.javaClass.kotlin.memberProperties 

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

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

Вы не можете сделать это в Котлине, но есть грязный ненадежный способ сделать это в 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 

оно работает )

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

 val fields = MyClass.javaClass.kotlin.members 

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

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

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

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

 val fields = MyClass.javaClass.declaredFields