第十章:注解与反射

注解

  1. 应用注解: 关键字@
    常用:@Deprecated 被废弃, 可以使用replaceWith参数增强它。该注解可以传入参数message, replaceWith, level。参数类型:基本数据类型、字符串、枚举、类引用、其他的注解类以及前面这些类型的数组;
    注意:把一个类指定为注解实参,在类名后加上::class ; 把另外一个注解指定为一个实参,去掉注解名称前面的@; 要把一个数组指定为一个实参,使用arrayOf函数;把属性当做注解,需要使用const来标注;

  2. 注解目标
    使用点目标声明被用来说明要注解的元素。使用点目标被放在@符号和注解名称之间,并用冒号和注解名称隔开。
    第十章:注解与反射_第1张图片
    第十章:注解与反射_第2张图片
    任何应用到file目标的注解都必须放在文件的顶层,放在package指令之前。常用的@file:JvmName("")改变对应类的文件名。
    **Kotlin允许对任意的表达式应用注解,而不仅仅是类和函数的声明及类型。**常用的@Suppress()用它来抑制被注解的表达式的上下文中的特定的编译器警告。
    第十章:注解与反射_第3张图片

  3. 用注解来控制Java API
    @JvmName() 改变由kotlin生成的java方法或字段的名称
    @JvmStatic() 能被用在对象声明或者伴生对象的方法上,把他们暴露成Java的静态方法
    @JvmOverloads 指导编译器为带默认参数值的函数生成多个重载函数
    @JvmField 可以用于一个属性,把这个属性暴露成一个没有访问器的共有Java字段

  4. 使用注解定制序列化
    序列化:把对象转换成可以存储或者在网络上传输的二进制或者文本的表示法。它的逆向过程叫做反序列化。
    声明注解: annotation class , 注意:对于一个注解类的所有参数必须使用val,是强制的。 在声明类前面加上annotation
    元注解:可以应用到注解类上的注解被叫做元注解 常用的@Target 指定注解使用的目标

    要声明自己的元注解使用@Target(AnnotationTarget.ANNOTATION_CLASS)
    @Retention注解的作用:声明注解的声明周期,Kotlin默认在RUNNTIME保留
    ::class 作用:引用一个类
    在这里插入图片描述
    KClass是Java的java.lang.Class类型在Kotlin中的对应类型,保存Kotlin类的引用,out作用说明可以引用那些继承Any的类,而不仅仅是Any类自己

反射

  1. 反射定义:一种在运行时动态地访问对象属性和方法的方式,而不需要事先确定这些属性是什么。

  2. 使用方式:

    • 标准的Java反射 java.lang.reflect
    • Kotlin反射API kotlin.reflect
  3. KClass类 Kotlin反射的主要入口, KClass对应java.lang.Class
    第十章:注解与反射_第4张图片
    运行时获取一个对象的类:首先使用java.class属性获取它的Java类,等价于Java的java.lang.Object.getClass(),然后访问该类的.kotlin扩展属性.
    ::FunName 这个表达式的值是来自反射API的KFunction类的一个实例
    KCallable是函数和属性的超接口,它声明了call方法,允许你调用对应的函数或者对应属性的getter
    KCallable.call()调用被引用的函数 KProperty调用该属性的getter,获取属性值的方法get方法
    KFunctionN, KPropertyN N代表参数的数量 称为合成的编译器生成类型
    例如:KFunction2声明了operator fun invoke(p1: P1, p2 : P2) : R
    第十章:注解与反射_第5张图片
    使用实例:

    第十章:注解与反射_第6张图片

你可能感兴趣的:(《Kotlin实战》笔记)