Sobes.tech
Middle

Рефлексия чист ва чӣ гуна дар Kotlin амалӣ карда мешавад?

sobes.tech AI

Ҷавоб аз AI

Рефлексия дари Kotlin имконият медиҳад, ки хусусиятҳои объектҳо, синфҳо ва узвҳои онҳо дар вақти иҷрои барнома таҳқиқ карда шаванд. Он имкон медиҳад, ки маълумот дар бораи навъи объект, методҳо, майдонҳо, конструкторҳо ва аннотацияҳоро ба даст оред, инчунин методҳоро динамикӣ даъват кунед ва арзишҳои майдонҳоро тағир диҳед.

Дар Kotlin рефлексия тавассути API дар баста kotlin.reflect амалӣ мешавад. Барои кор бо рефлексия зарур аст, ки вобастагиро kotlin-reflect илова кунед. Ин API синфҳоро пешниҳод мекунад, ки элементҳои гуногуни забонро намояндагӣ мекунанд:

  • KClass: синфро намояндагӣ мекунад. Имкон медиҳад, ки номи синф, рӯйхати конструкторҳо, узвҳо (методҳо ва хусусиятҳо), синфҳои болоӣ ва ғайраро ба даст оред.
  • KCallable: интерфейси умумӣ барои функсияҳо ва хусусиятҳо, ки метавонанд даъват шаванд.
  • KFunction: функсияро намояндагӣ мекунад. Имкон медиҳад, ки параметрҳоро, навъи баргардонидашударо ба даст оред ва функсияро даъват кунед.
  • KProperty: хусусиятро (модели узв) намояндагӣ мекунад. Имкон медиҳад, ки навъи хусусият, назорати он, аннотацияҳо ва гирифтани ё гузоштани арзишро ба даст оред.

Барои гирифтани объектҳои рефлексӣ операторҳои :: барои синфҳо, функсияҳо ва хусусиятҳо истифода мешаванд, ё методҳои java.kotlin барои гирифтани KClass аз Class-и Java.

Маслиҳатҳо барои истифода:

// Гирифтани KClass бо ёрии оператори ::class
val personClass: KClass<Person> = Person::class

// Гирифтани KClass аз Java Class
val personJavaClass: Class<Person> = Person::class.java
val personKotlinClass: KClass<Person> = personJavaClass.kotlin

// Гирифтани рӯйхати конструкторҳои синф
val constructors = personClass.constructors

// Гирифтани рӯйхати узвҳо (хусусиятҳо ва функсияҳо)
val members = personClass.members

// Гирифтани KFunction барои метод
val sayHelloFunction: KFunction<*> = personClass.members.find { it.name == "sayHello" } as KFunction<*>

// Даъвати метод тавассути рефлексия
val personInstance = Person("Alice")
sayHelloFunction.call(personInstance)

// Гирифтани KProperty барои хусусият
val nameProperty: KProperty1<Person, String> = personClass.members.find { it.name == "name" } as KProperty1<Person, String>

// Гирифтани арзиши хусусият тавассути рефлексия
val nameValue = nameProperty.get(personInstance)

// Гузоштани арзиши хусусият тавассути рефлексия (барои хусусиятҳои тағйирёбанда)
// val mutableNameProperty = personClass.members.find { it.name == "mutableName" } as KMutableProperty1<Person, String>
// mutableNameProperty.set(personInstance, "Bob")

Рефлексия барои:

  • Метапрограмика (ORM, сериализатсия/десериализатсия).
  • Эҷоди проксиҳои динамикӣ ва аспектҳо.
  • Санҷиш (доступ ба узвҳои хусусӣ).
  • Интроспексия дар вақти иҷро.

Муҳим аст, ки истифодаи рефлексия метавонад иҷроишро кам кунад ва кодиро мураккабтар созад, инчунин метавонад бехатариро кам кунад, зеро он модификаторҳои дастрасиро убур мекунад. Ин бояд бо эҳтиёт ва дар ҷойҳое, ки дигар роҳҳо самаранок нестанд ё имконнопазиранд, истифода шавад.