Kotlin学习笔记:注解和反射

Kotlin学习笔记:概述
Kotlin学习笔记:基本语法和函数
Kotlin学习笔记:类和接口
Kotlin学习笔记:lambda编程
Kotlin学习笔记:类型系统
Kotlin学习笔记:泛型
Kotlin学习笔记:注解和反射

注解

自定义注解

annotation class MyAnnotation{
    
}

元注解

  • @Target 指定可以用该注解标注的元素的可能的类型(类、函数、属性、表达式等);
  • @Retention 指定该注解是否存储在编译后的 class 文件中,以及它在运行时能否通过反射可见 (默认都是 true);
  • @Repeatable 允许在单个元素上多次使用相同的该注解;
  • @MustBeDocumented 指定该注解是公有 API 的一部分,并且应该包含在生成的 API 文档中显示的类或方法的签名中。

注解使用处目标

当对属性或主构造函数参数进行标注时,从相应的 Kotlin 元素生成的 Java 元素会有多个,因此在生成的 Java 字节码中该注解有多个可能位置 。如果要指定精确地指定应该如何生成该注解,请使用以下语法:

class Example(@field:Ann val foo,    // 标注 Java 字段
              @get:Ann val bar,      // 标注 Java getter
              @param:Ann val quux)   // 标注 Java 构造函数参数

支持的使用处目标的完整列表为:

  • file
  • property(具有此目标的注解对 Java 不可见);
  • field
  • get(属性 getter);
  • set(属性 setter);
  • receiver(扩展函数或属性的接收者参数);
  • param(构造函数参数);
  • setparam(属性 setter 参数);
  • delegate(为委托属性存储其委托实例的字段)。

反射

反射,简单点说,就是可以在运行时动态的访问对象属性和方法的方式

Kotlin 反射API

Kotlin学习笔记:注解和反射_第1张图片
image.png
  • 类引用(KClass)

最基本的反射功能是获取 Kotlin 类的运行时引用。要获取对静态已知的 Kotlin 类的引用,可以使用 类字面值 语法:

val c = MyClass::class

Kotlin类引用和Java类引用不同。如果要获得Java类引用,需要改成MyClass::class.java

可调用引用

函数、属性以及构造函数的引用,除了作为自省程序结构外, 还可以用于调用或者用作函数类型的实例。

所有可调用引用的公共超类型是 KCallable, 其中 R 是返回值类型,对于属性是属性类型,对于构造函数是所构造类型。

函数引用

当我们有一个命名函数声明如下:

fun isOdd(x: Int) = x % 2 != 0

我们可以很容易地直接调用它(isOdd(5)),但是我们也可以将其作为一个函数类型的值,例如将其传给另一个函数。为此,我们使用 :: 操作符:

val numbers = listOf(1, 2, 3)
println(numbers.filter(::isOdd))

这里 ::isOdd 是函数类型 (Int) -> Boolean 的一个值。

函数引用属于 KFunction 的子类型之一,取决于参数个数,例如 KFunction3

属性引用

要把属性作为 Kotlin中 的一等对象来访问,我们也可以使用 :: 运算符:

val x = 1

fun main() {
    println(::x.get())
    println(::x.name) 
}

表达式 ::x 求值为 KProperty 类型的属性对象,它允许我们使用 get() 读取它的值,或者使用 name属性来获取属性名。更多信息请参见关于 KProperty 类的文档。

构造函数引用

构造函数可以像方法和属性那样引用。他们可以用于期待这样的函数类型对象的任何地方:它与该构造函数接受相同参数并且返回相应类型的对象。 通过使用 :: 操作符并添加类名来引用构造函数。考虑下面的函数, 它期待一个无参并返回 Foo 类型的函数参数:

class Foo

fun function(factory: () -> Foo) {
    val x: Foo = factory()
}

使用 ::Foo,类 Foo 的零参数构造函数,我们可以这样简单地调用它:

function(::Foo)

构造函数的可调用引用的类型也是 KFunction 的子类型之一 ,取决于其参数个数。

你可能感兴趣的:(Kotlin学习笔记:注解和反射)