2015-02-08 18 views
12

c'è un equivalente per la riflessione java foo.getClass().getFields() in Kotlin? Potrei solo trovare che posso accedere a un campo quando so che è il nome, ma mi piacerebbe gestire i campi in modo generico.kotlin reflection ottieni l'elenco dei campi

+4

AFAIK è in fase di sviluppo. Sentiti libero di votare o votare su un problema correlato (https://youtrack.jetbrains.com/issue/KT-6570) per ottenere aggiornamenti. – bashor

+0

Grazie, questo risponde alla mia domanda. Non riesco a trovare il pulsante per "accettare" la risposta .. – fwilhe

+0

Siete i benvenuti! I commenti non possono essere contrassegnati. – bashor

risposta

1

Non si può fare questo in Kotlin, ma c'è un modo inaffidabile e sporco per farlo in java. Puoi usare java reflection. Come questo:

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(", ") 
    }  
} 

Testiamola:

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) 

Risultati:

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

funziona)

+0

Non è quello che mi serve, voglio scorrere i campi delle classi (che possono avere un numero qualsiasi di campi con nomi che non conosco), da qui la domanda per una "lista" (di qualsiasi tipo) .. – fwilhe

+0

c'è il metodo getFields, un momento) – Leonidos

+0

La riflessione di Kotlin può farlo molto più facilmente, a cosa si chiede la domanda ... –

7

Volevi campi-in "campo supporto" o campi come in "proprietà" ... Kotlin ha solo proprietà. È possibile ottenere questi per qualche classe utilizzando:

MyTest::class.memberProperties 

// or 

MyTest::class.declaredMemberProperties 

E da un Java Class<T>, utilizzare la proprietà kotlin estensione per ottenere il Kotlin KClass<T> da cui si può procedere:

someClassOfMine.javaClass.kotlin.memberProperties 

Questo richiede la La dipendenza da kotlin-reflect deve essere aggiunta al percorso di costruzione e di classe. Troverete molte altre cose utili su KClass

Per i campi di backing segreti dietro una proprietà, utilizzare la riflessione Java a proprio rischio.

0

Molto facile ora con Kotlin v1.1, è possibile utilizzare il seguente metodo per ottenere i campi in Kotlin

val fields = MyClass.javaClass.kotlin.members 

Dove MyClass è la classe di vostra scelta.

Per poter utilizzare questo è necessario avere Kotlin-riflettere incluso nel file di generazione Gradle come di seguito

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

Inoltre, è anche possibile ottenere i campi dalla JavaClass direttamente se avete bisogno di campi di Java (utile in alcuni casi che coprono un ambito leggermente diverso)

val fields = MyClass.javaClass.declaredFields 
Problemi correlati