📜  Kotlin 反射

📅  最后修改于: 2022-05-13 01:54:52.422000             🧑  作者: Mango

Kotlin 反射

反射是一组语言和库功能,提供在运行时内省给定程序的功能。 Kotlin 反射用于在运行时利用类及其成员,如属性、函数、构造函数等。
除了Java反射 API,Kotlin 还以简单的函数式风格提供了自己的一组反射 API。 Kotlin 中也提供了标准的Java反射结构,并且可以完美地与它的代码配合使用。
Kotlin 反射可用于:

kotlin.reflect package

Kotlin 反射的特点——

  1. 它允许访问属性和可为空的类型
  2. Kotlin 反射对Java反射有一些额外的特性。
  3. kotlin 反射有助于访问由一种语言编写的 JVM 代码

类参考 -

要在运行时获取静态已知的类引用,请使用类引用运算符。此外,对类的引用也可以从类的实例中获得,这种引用称为有界类引用。使用实例,您可以获得对对象符合的确切类型的引用,以防继承。
演示类引用的示例

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}")
}


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(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)
}


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)))
}


Java
class Property(var a: Float){
}
fun main(){
    // Constructor Reference
    val y = ::Property
    println(y.name)
}


输出

This is a class reference class kotlin1.com.programmingKotlin.chapter1.ReflectionDemo
This is a bounded class reference class kotlin1.com.programmingKotlin.chapter1.ReflectionDemo 

函数参考——

我们可以获得对 Kotlin 中定义的每个命名函数的函数引用。这可以通过在函数名称加上::运算符来完成。然后这些函数引用可以用作其他函数的参数。在重载函数的情况下,我们可以明确指定函数的类型,也可以从内容中隐式确定。
演示功能引用的示例

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(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)
}

输出

[3, 6, 9]
fun add(kotlin.String, kotlin.String): kotlin.String
8 

物业参考 –

我们可以使用::运算符以与函数类似的方式获取属性引用。如果属性属于某个类,则还应使用::运算符指定类名。这些属性引用允许我们将属性视为对象,也就是说,我们可以使用 get函数获取值或使用 set函数修改它。
演示属性引用的示例

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)))
}

输出

10
x
5.899 

构造函数参考 -

可以通过与方法和属性的引用类似的方式获得对类的构造函数的引用。这些引用可以用作对返回该类型对象的函数的引用。但是,这些用途很少见。
演示构造函数引用的示例

Java

class Property(var a: Float){
}
fun main(){
    // Constructor Reference
    val y = ::Property
    println(y.name)
}

输出