Reflection es un conjunto de funciones de lenguaje y biblioteca que proporciona la función de introspección de un programa dado en tiempo de ejecución. La reflexión de Kotlin se usa para utilizar la clase y sus miembros como propiedades, funciones , constructores , etc. en tiempo de ejecución.
Junto con la API de reflexión de Java, Kotlin también proporciona su propio conjunto de API de reflexión, en un estilo simple y funcional. Las construcciones estándar de Java Reflection también están disponibles en Kotlin y funcionan perfectamente con su código.
Los reflejos de Kotlin están disponibles en:
kotlin.reflect package
Características de la reflexión de Kotlin:
- Da acceso a propiedades y tipos anulables.
- La reflexión de Kotlin tiene algunas características adicionales a la reflexión de Java.
- El reflejo de kotlin ayuda a acceder al código JVM, escrito por un lenguaje
Referencias de clase –
Para obtener una referencia de clase en tiempo de ejecución que se conoce estáticamente, utilice el operador de referencia de clase . Además, la referencia a una clase también se puede obtener de las instancias de la clase, dichas referencias se conocen como referencias de clase acotadas . Utilizando instancias, se obtiene la referencia al tipo exacto al que se ajusta el objeto, en caso de herencia.
Ejemplo para demostrar las referencias de clase
Java
// A sample empty class class ReflectionDemo { } fun main() { // Reference obtained using class name val abc = ReflectionDemo::class println("This is a class reference $abc") // Reference obtained using object val obj = ReflectionDemo() println("This is a bounded class reference ${obj::class}") }
Producción
This is a class reference class kotlin1.com.programmingKotlin.chapter1.ReflectionDemo This is a bounded class reference class kotlin1.com.programmingKotlin.chapter1.ReflectionDemo
Referencias de funciones –
Podemos obtener una referencia funcional para cada función nombrada que se define en Kotlin. Esto se puede hacer precediendo el nombre de la función con el operador :: . Estas referencias funcionales se pueden utilizar como parámetros para otras funciones. En el caso de funciones sobrecargadas, podemos especificar explícitamente el tipo de función o puede determinarse implícitamente a partir del contenido.
Ejemplo para demostrar referencias funcionales
Java
fun add(a: Int,b: Int) : Int{ return a+b; } fun add(a: String,b: String): String{ return """$a$b""" } fun isDivisibleBy3(a: Int): Boolean{ return a%3 == 0 } fun main(){ // Function reference obtained using :: operator val ref1 = ::isDivisibleBy3 val array = listOf<Int>(1,2,3,4,5,6,7,8,9) println(array.filter(ref1)) // Function reference obtained for an overloaded function // By explicitly specifying the type val ref2: (String,String) -> String = ::add; println(ref2) // Function reference obtained implicitly val x = add(3,5) println(x) }
Producción
[3, 6, 9] fun add(kotlin.String, kotlin.String): kotlin.String 8
Referencias de propiedades –
Podemos obtener la referencia de la propiedad de manera similar a la de la función, usando el operador :: . Si la propiedad pertenece a una clase, el nombre de la clase también debe especificarse con el operador :: . Estas referencias a propiedades nos permiten tratar una propiedad como un objeto, es decir, podemos obtener sus valores usando la función get o modificarlos usando la función set.
Ejemplo para demostrar referencias de propiedad
Java
class Property(var a: Float){ } val x = 10; fun main(){ // Property Reference for a package level property val z = ::x println(z.get()) println(z.name) // Property Reference for a class property val y = Property::a println(y.get(Property(5.899f))) }
Producción
10 x 5.899
Referencias de constructores –
Las referencias a constructores de una clase se pueden obtener de manera similar a las referencias a métodos y propiedades. Estas referencias se pueden usar como referencias a una función que devuelve un objeto de ese tipo. Sin embargo, estos usos son raros.
Ejemplo para demostrar las referencias de constructores
Java
class Property(var a: Float){ } fun main(){ // Constructor Reference val y = ::Property println(y.name) }
Producción
<init>
Publicación traducida automáticamente
Artículo escrito por CharchitKapoor y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA