2017-03-23 4 views
1

0 ist Ich möchte über alle Felder in einer meiner Klassen iterieren, für annotierte filtern und dann überprüfen, ob das Feld einen bestimmten Typ hat.
Alles, was ich fand, war , aber ich weiß nicht, wie man die KType meiner anderen Klasse bekommt.Kotlin Reflection - Überprüfen Sie, ob die Eigenschaft

Hier ist mein Code so weit:

target.declaredMemberProperties.forEach { 
    if (it.findAnnotation<FromOwner>() != null) { 
     if (/* it.returnType is Component <- Here I need some working check */) { 

      // do stuff 
     } else { 

      // do ther stuff 
     } 
    } 
} 

Antwort

5

Es gibt mindestens zwei Lösungen hier:

  • Holen Sie sich das KClass<*> von it.returnType.jvmErasure verwenden, dann den Subtyp Beziehung für die KClass es überprüfen :

    it.returnType.jvmErasure.isSubclassOf(Component::class) 
    
  • Seit Kotlin 1.1 können Sie die KType vom KClass Token .createType() konstruieren (überprüfen Sie die optionalen Parameter: Sie können sie verwenden, NULL-Zulässigkeit Info, Typ Argumente und Anmerkungen zur Verfügung zu stellen), und überprüfen Sie den Subtyp, wie Sie vorgeschlagen:

    it.returnType.isSubtypeOf(Component::class.createType()) 
    

    Das Erstellen des Typs bei jeder Iteration kann zu Leistungsproblemen führen, stellen Sie sicher, dass Sie sie zwischenspeichern, wenn Sie sie häufig benötigen.

+0

bedeutet das es eine gute Idee von faul wäre, zu haben 'val component {Component :: class.createType()}' in einem Begleitobjekt? – danielspaniol

+0

@Exhauzt, ich denke, Benchmarking Ihrer besonderen Anwendungsfall sollte hier die beste Antwort geben. – hotkey

Verwandte Themen