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
risposta
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)
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
c'è il metodo getFields, un momento) – Leonidos
La riflessione di Kotlin può farlo molto più facilmente, a cosa si chiede la domanda ... –
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.
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
- 1. campi di estensione in Kotlin
- 2. Scala. Ottieni l'elenco dei nomi dei campi dalla classe
- 3. Ottieni parametri di un attributo utilizzando Reflection
- 4. Ordina raccolta per più campi in Kotlin
- 5. Ottieni PropertyType.Name in reflection da tipo Nullable
- 6. Ottieni il nome della variabile. javascript "reflection"
- 7. Lua - Reflection - Ottieni un elenco di funzioni/campi su un oggetto?
- 8. Ottieni i nomi dei campi ordinati da peewee Modello
- 9. Ottieni valori dalla tabella dei campi di testo javascript
- 10. Ottieni dinamicamente la funzione in Kotlin
- 11. Modifica dei campi finali in Java
- 12. Perché utilizziamo "oggetto associato" come una sorta di sostituzione dei campi statici Java in Kotlin?
- 13. Campi statici di interfaccia Java di riferimento in Kotlin
- 14. Ottieni NomeTipo generico in buon formato utilizzando Reflection su C#
- 15. C# Reflection: ottieni * tutti * gli assembly attivi in una soluzione?
- 16. Ottieni i campi del modello in Django
- 17. Raggruppamento dei campi modulo Django
- 18. Simbolo Groovy @ prima dei campi
- 19. Rails: controllo dei campi modificati
- 20. Django order_by somma dei campi
- 21. Selezione dei campi dall'uscita JSON
- 22. Inizializzazione ordine dei campi finali
- 23. L'API Dosen't Reflection interrompe lo scopo stesso dell'incapsulamento dei dati?
- 24. Come accedere ai valori dei parametri predefiniti tramite Scala reflection?
- 25. Ripristino dell'elenco dei campi dal pragma "campi di utilizzo"?
- 26. java reflection per creare campo/valore hashmap
- 27. Ottieni i nomi dei campi di un record Haskell come un elenco di stringhe?
- 28. Objective C Introspection/Reflection
- 29. Command pattern vs reflection
- 30. Kotlin runtime jar vs kotlin stdlib jar
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
Grazie, questo risponde alla mia domanda. Non riesco a trovare il pulsante per "accettare" la risposta .. – fwilhe
Siete i benvenuti! I commenti non possono essere contrassegnati. – bashor