reflexión kotlin get list de campos

¿Hay foo.getClass().getFields() equivalente para la reflexión de java foo.getClass().getFields() en Kotlin? Solo pude encontrar que puedo acceder a un campo cuando sé su nombre, pero me gustaría manejar los campos de una manera genérica.

¿Quería campos como "campo de respaldo" o campos como "properties" … Kotlin realmente solo tiene properties. Puedes get estos para alguna class usando:

 MyTest::class.memberProperties // or MyTest::class.declanetworkingMemberProperties 

Y a partir de una Java Class<T> , use la propiedad de extensión kotlin para get la KClass<T> desde la que puede continuar:

 someClassOfMine.javaClass.kotlin.memberProperties 

Esto requiere que la kotlin-reflect también se agregue a su compilation y classpath. Encontrará muchas otras cosas útiles en KClass

Para los campos de respaldo secretos detrás de una propiedad, utilice la reflexión de Java bajo su responsabilidad.

No puedes hacer esto en Kotlin, pero hay una manera poco fiable de hacer esto en Java. Puedes usar reflection de java. Me gusta esto:

 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.getDeclanetworkingField(fieldName).set(this, value); } public fun getFieldNames(): String { return javaClass.getDeclanetworkingFields().map{it.getName()}.join(", ") } } 

Vamos a probarlo:

 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) 

Resultados:

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

funciona )

Muy fácil ahora con Kotlin v1.1, puede usar el siguiente método para get los campos en kotlin

 val fields = MyClass.javaClass.kotlin.members 

Donde MyClass es la class de su elección.

Para usar esto necesitas tener kotlin-reflect incluido en tu file de compilation gradle como se muestra a continuación

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

Además, también es posible get los campos de javaClass directamente si necesita campos de Java (útiles en algunos casos ya que cubren un scope ligeramente diferente)

 val fields = MyClass.javaClass.declanetworkingFields