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