Úvaha s Kotlinom

1. Úvod

Reflection je názov schopnosti kontrolovať, načítať a pracovať s triedami, poľami a metódami za behu. Môžeme to urobiť, aj keď nevieme, čo sú v čase kompilácie.

To má veľké množstvo využití, v závislosti od toho, čo vyvíjame. Napríklad rámce ako Spring to veľmi využívajú.

Podpora je zabudovaná do JVM, a je tak implicitne dostupná pre všetky jazyky založené na JVM. Niektoré jazyky JVM však majú nad to, čo je už k dispozícii, ďalšiu podporu.

2. Java Reflection

Všetky štandardné konštrukcie Java Reflection sú k dispozícii a perfektne fungujú s našim kódom Kotlin. Patria sem: java.lang.Class triedy, ako aj všetkého v java.lang.reflect balíček.

Ak chceme z akéhokoľvek dôvodu používať štandardné rozhrania Java Reflection API, môžeme tak urobiť rovnakým spôsobom, ako by sme to robili v prostredí Java. Napríklad na získanie zoznamu všetkých verejných metód v triede Kotlin by sme urobili:

MyClass :: class.java.methods

Toto sa rozdelí na nasledujúce konštrukcie:

  • MyClass :: trieda nám dáva zastúpenie triedy Kotlin pre Moja trieda trieda
  • .java nám dáva java.lang.Class ekvivalent
  • .metódy je výzva na java.lang.Class.getMethods () prístupová metóda

Toto bude fungovať úplne rovnako, či už sa volá z Javy alebo Kotlina, a či sa volá z triedy Java alebo Kotlin. Patria sem konštrukty špecifické pre Kotlin, napríklad dátové triedy.

dátová trieda ExampleDataClass (názov VAL: String, var povolená: Boolean) ExampleDataClass :: class.java.methods.forEach (:: println)

Kotlin prevádza vrátené typy aj na Kotlinove reprezentácie.

Vo vyššie uvedenom dostaneme a kotlin.Array na ktoré môžeme volať pre každý().

3. Vylepšenia odrazu Kotlin

Aj keď môžeme používať štandardné Java Reflection API, nevie o všetkých rozšíreniach, ktoré Kotlin prináša na platformu.

V niektorých situáciách môže byť jeho použitie občas nepríjemné. Kotlin prináša vlastné reflexné API, ktoré môžeme použiť na riešenie týchto problémov.

Všetky vstupné body do Kotlin Reflection API používajú odkazy. Predtým sme videli použitie ::trieda uviesť odkaz na definíciu triedy. Toto tiež budeme môcť použiť na získanie odkazov na metódy a vlastnosti.

3.1. Odkazy na triedu Kotlin

Kotlin Reflection API umožňuje prístup k odkazu na triedu. To sa potom dá použiť na preskúmanie všetkých podrobností triedy Kotlin. Toto umožňuje prístup k odkazu na triedu Java - java.lang.Class objekt - ale aj na všetky konkrétne podrobnosti Kotlinovej.

Kotlin API pre podrobnosti triedy sa sústreďuje okolo kotlin.reflect.KClass trieda. Prístup k nim je možný pomocou :: operátor z ľubovoľného názvu triedy alebo inštancie - napr. Reťazec :: trieda.

Alternatívne je k nemu prístup pomocou metódy rozšírenia java.lang.Class.kotlin ak Java Trieda inštancia je k dispozícii pre nás:

val listClass: KClass = Zoznam :: class val name = "Baeldung" val stringClass: KClass = name :: class val someClass: Class val kotlinClass: KClass = someClass.kotlin

Akonáhle sme získali a KClass objektu, existuje niekoľko jednoduchých vecí, ktoré nám môžu povedať o príslušnej triede. Niektoré z nich sú štandardné koncepty Java a iné sú špecifické koncepty Kotlin.

Napríklad môžeme ľahko zistiť, či je Trieda abstraktná alebo konečná, ale môžeme tiež zistiť, či je Trieda dátovou triedou alebo Sprievodnou triedou:

val stringClass = String :: class assertEquals ("kotlin.String", stringClass.qualifiedName) assertFalse (stringClass.isData) assertFalse (stringClass.isCompanion) assertFalse (stringClass.isAbstract) assertTrue (stringClass.isFinal) assertFalse (stringClass.isData)

Máme tiež spôsoby, ako sa pohybovať v hierarchii tried. V Jave už môžeme prejsť z Triedy do jej nadtriedy, rozhraní a vonkajšej triedy, v ktorej je uzavretá - ak je to vhodné.

Kotlin k tomu pridáva možnosť získať Sprievodný objekt pre ľubovoľnú triedu a Objekt inštancia pre triedu Object:

println (TestWithCompanion :: class.companionObject) println (TestWithCompanion :: class.companionObjectInstance) println (TestObject :: class.objectInstance)

Môžeme vytvoriť nové inštancie triedy aj z Class Referencerovnakým spôsobom ako v prostredí Java:

val listClass = ArrayList :: trieda val list = listClass.createInstance () assertTrue (zoznam je ArrayList)

Prípadne môžeme získať prístup k konštruktorom a ak je to potrebné, použiť explicitný. Toto sú všetky odkazy na metódy, ako sú popísané v nasledujúcej časti.

Veľmi podobným spôsobom môžeme získať prístup ku všetkým metódam, vlastnostiam, rozšíreniam a ďalším členom triedy:

val bigDecimalClass = BigDecimal :: class println (bigDecimalClass.constructors) println (bigDecimalClass.functions) println (bigDecimalClass.memberProperties) println (bigDecimalClass.memberExtensionFunctions)

3.2. Odkazy na Kotlinovu metódu

Okrem toho, že dokáže komunikovať s triedami, môžeme tiež komunikovať s metódami a vlastnosťami.

Patria sem vlastnosti triedy - definované pomocou val alebo var, metódy štandardných tried a funkcie najvyššej úrovne. Rovnako ako predtým to funguje rovnako dobre na kóde napísanom v štandardnej Jave aj na kóde napísanom v Kotline.

Rovnakým spôsobom ako pri výučbe môžeme získať odkaz na metódu alebo vlastnosť pomocou:: operátor.

Vyzerá to úplne rovnako ako v prostredí Java 8 na získanie odkazu na metódu a môžeme ho použiť úplne rovnakým spôsobom. V Kotline sa však tento odkaz na metódu dá použiť aj na získanie reflexných informácií o cieli.

Keď získame referenciu o metóde, môžeme ju nazvať, akoby to bola skutočne metóda, o ktorú ide. Toto sa nazýva Vyvolateľná referencia:

val str = "Dobrý deň" val lengthMethod = str :: length assertEquals (5, lengthMethod ())

Rovnakým spôsobom ako v prípade tried môžeme získať ďalšie podrobnosti o metóde. Patria sem štandardné podrobnosti Java, ako aj podrobnosti špecifické pre Kotlin, napríklad ak ide o metódu operátor alebo ak je v rade:

val byteInputStream = String :: byteInputStream assertEquals ("byteInputStream", byteInputStream.name) assertFalse (byteInputStream.isSuspend) assertFalse (byteInputStream.isExternal) assertTrue (byteInputStream.isInline) assertFalse (byteInputStream. byte)

Okrem toho môžeme prostredníctvom tohto odkazu získať viac informácií o vstupoch a výstupoch metódy.

Patria sem podrobnosti o návratovom type a parametroch vrátane podrobností týkajúcich sa Kotlina - napríklad nullabilita a voliteľnosť.

val str = "Dobrý deň" val method = str :: byteInputStream assertEquals (ByteArrayInputStream :: class.starProjectedType, method.returnType) assertFalse (method.returnType.isMarkedNullable) assertEquals (1, method.parameters.size) assertTrue (method.parameters 0] .isOptional) assertFalse (method.parameters [0] .isVararg) assertEquals (Charset :: class.starProjectedType, method.parameters [0] .type)

3.3. Odkazy na nehnuteľnosť Kotlin

Rovnako to funguje aj v prípade Vlastnosti, aj keď je zrejmé, že podrobnosti, ktoré je možné získať, sú rôzne. Vlastnosti nás môžu naopak informovať, či sú konštanty, neskoré inicializované alebo zmeniteľné:

lateinit var mutableProperty: String val mProperty = this :: mutableProperty assertEquals ("mutableProperty", mProperty.name) assertTrue (mProperty.isLateinit) assertFalse (mProperty.isConst) assertTrue (mProperty je KMutableProperty)

Upozorňujeme, že koncept vlastností funguje aj v akomkoľvek inom kóde ako Kotlin. Identifikujú sa podľa polí, ktoré sa riadia konvenciami JavaBeans ohľadne metód getra a setra.

Patria sem triedy v štandardnej knižnici Java. Napríklad Hoditeľné trieda má Nehnuteľnosť Hádzateľná. Správa na základe skutočnosti, že existuje metóda getMessage () definované v ňom.

K skutočnej vlastnosti môžeme získať prístup k odkazom na metódy, ktoré sú odkryté - the getter a stavač metódy. The stavač je k dispozícii, iba ak pracujeme s KMutableProperty - teda majetok bol vyhlásený za var, keďže getter je vždy k dispozícii.

Tieto sú vystavené ľahšie použiteľným spôsobom prostredníctvom internetu dostať () a sada () metódy. The getter a stavač hodnoty sú skutočné odkazy na metódy, čo nám umožňuje pracovať s nimi úplne rovnako ako s inými odkazmi na metódy:

val prop = this :: mutableProperty assertEquals (String :: class.starProjectedType, prop.getter.returnType) prop.set ("Hello") assertEquals ("Hello", prop.get ()) prop.setter ("svet") assertEquals ("Svet", prop.getter ())

4. Zhrnutie

Tento článok poskytuje prehľad niektorých vecí, ktoré je možné dosiahnuť pomocou reflexie v Kotline, vrátane toho, ako interaguje s reflexnými schopnosťami zabudovanými do štandardného jazyka Java a líši sa od nich.

Všetky príklady sú k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found