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 
Intereting Posts
Вызвать getMeasuredWidth () или getWidth () для возврата RecyclerView 0 при привязке данных Kotliquery не закрывает связи postgresql Добавление Kotlin к существующим Java-проектам нарушает ошибки в сообщениях об ошибках Android Studio Какое надлежащее обходное решение для @BeforeAll в Котлине Класс тестирования детей Kotlin запускает все родительские тесты Комната с кинжалом в Котлине: Дао имеет значение null, при введении в класс Могу ли я ленить инициализировать значение в зависимости от конструктора? Получите дополнительную строку от активности Kotlin Spring Security несколько успешных поставщиков аутентификации Возвращение null от fun в kotlin Требует аннотации продюсирования с «allOf» в Котлине Запуск Котлинского кодекса на платформе SBT / Play? Как я могу получить ссылку на Kotlin KClass по имени, когда не работает на JVM? Создайте карту списков из Spring config в Kotlin Kotlin использует специальный репозиторий SpringData Jpa