Refleksiya nima va u Kotlinda qanday amalga oshiriladi?
sobes.tech AI
AIdan javob
Kotlin-də refleksiya obyektlərin, siniflərin və onların üzvlərinin xüsusiyyətlərini icra zamanı araşdırmaq imkanıdır. Bu, obyektin növü, metodlar, sahələr, qurucular və anotasiya haqqında məlumat almağa və metodları dinamik şəkildə çağırmağa və sahə dəyərlərini dəyişməyə imkan verir.
Kotlin-də refleksiya kotlin.reflect paketindəki API toplusu vasitəsilə həyata keçirilir. Refleksiya ilə işləmək üçün kotlin-reflect asılılığını əlavə etmək lazımdır. Bu API dilin müxtəlif elementlərini təmsil edən sinflər təmin edir:
KClass: sinfi təmsil edir. Sinif adını, qurucuların siyahısını, üzvləri (metodlar və xüsusiyyətlər), supersiniflər və s. əldə etməyə imkan verir.KCallable: çağırıla bilən funksiyalar və xüsusiyyətlər üçün ümumi interfeys.KFunction: funksiyanı təmsil edir. Parametrləri, geri dönüş növünü əldə etməyə və funksiyanı çağırmağa imkan verir.KProperty: xüsusiyyəti (üzv dəyişəni) təmsil edir. Xüsusiyyətin növünü, görünürlüğünü, anotasiya və onun dəyərini alma və təyin etməyə imkan verir.
Refleksiya obyektlərini əldə etmək üçün :: operatorlarından siniflər, funksiyalar və xüsusiyyətlər üçün istifadə olunur və ya .java.kotlin tipli metodlar vasitəsilə Java Class-dan KClass alınır.
İstifadə nümunələri:
// `::class` operatoru ilə KClass əldə etmək
val personClass: KClass<Person> = Person::class
// Java sinifindən KClass əldə etmək
val personJavaClass: Class<Person> = Person::class.java
val personKotlinClass: KClass<Person> = personJavaClass.kotlin
// Sinifin qurucularının siyahısını əldə etmək
val constructors = personClass.constructors
// Sinifin üzvlərinin siyahısını əldə etmək (xüsusiyyətlər və funksiyalar)
val members = personClass.members
// Metod üçün KFunction əldə etmək
val sayHelloFunction: KFunction<*> = personClass.members.find { it.name == "sayHello" } as KFunction<*>
// Refleksiya ilə metod çağırmaq
val personInstance = Person("Alice")
sayHelloFunction.call(personInstance)
// Xüsusiyyət üçün KProperty əldə etmək
val nameProperty: KProperty1<Person, String> = personClass.members.find { it.name == "name" } as KProperty1<Person, String>
// Refleksiya ilə xüsusiyyətin dəyərini almaq
val nameValue = nameProperty.get(personInstance)
// Refleksiya ilə xüsusiyyətin dəyərini dəyişmək (dəyişkən xüsusiyyətlər üçün)
// val mutableNameProperty = personClass.members.find { it.name == "mutableName" } as KMutableProperty1<Person, String>
// mutableNameProperty.set(personInstance, "Bob")
Refleksiya aşağıdakı üçün faydalıdır:
- Metaproqramlaşdırma (ORM çərçivələri, serializasiya/deserializasiya).
- Dinamik proxy və aspektlərin yaradılması.
- Testlər (özəl üzvlərə giriş).
- İcra zamanı inspektsiya.
Refleksiya istifadəsi performansı azalda və kodu mürəkkəbləşdirə bilər, həmçinin giriş modifikatorlarının keçilməsi səbəbindən daha az təhlükəsiz ola bilər. Bu, şüurlu şəkildə və digər yanaşmaların effektiv və ya mümkün olmadığı hallarda istifadə edilməlidir.