【2025最新版Kotlin教程】Kotlin第一行代码系列第十一课-注解和反射

79 阅读2分钟
【2025最新版Kotlin教程】Kotlin第一行代码系列第十一课-注解和反射

这节也可以选学

注解不是注释哈,别搞混了,注解是@xx,可加在类上,方法方法,甚至属性上。做一种补充说明,注解技术往往需要反射配合

看懂例子,就会自己怎么写注解了

一、注解
// 看过简单的例子
class A{

    @Deprecated("方法已过期,不建议使用,请使用newMethod方法")
    fun guoQi(){

    }
    fun newMethod(){

    }
}

/**
 * 介绍下@Target@Retention的知识点
 */
// 看下它们的取值
public enum class AnnotationTarget {
    // 类、接口、object、注解类
    CLASS,//===================================>作用于类
    // 注解类
    ANNOTATION_CLASS,
    // 泛型参数
    TYPE_PARAMETER,
    // 属性
    PROPERTY,
    // 字段、幕后字段
    FIELD,//============================>作用于变量
    // 局部变量
    LOCAL_VARIABLE,
    // 函数参数
    VALUE_PARAMETER,
    // 构造器
    CONSTRUCTOR,
    // 函数
    FUNCTION,//=============================>作用于方法
    // 属性的getter
    PROPERTY_GETTER,
    // 属性的setter
    PROPERTY_SETTER,
    // 类型
    TYPE,
    // 表达式
    EXPRESSION,
    // 文件
    FILE,
    // 类型别名
    TYPEALIAS
}

public enum class AnnotationRetention {
    // 注解只存在于源代码,编译后不可见
    SOURCE,
    // 注解编译后可见,运行时不可见
    BINARY,
    // 编译后可见,运行时可见
    RUNTIME //==================================>一般用它
}

/**
 * 自定义注解关键字 annotation class
 * 看BindView
 */

/**
 * 注解的范例,看BindView
 */

class TestActivity{
    //Android开发中范例使用,只是做个样式,但是代码是正确的

//    @BindView(id = R.id.tv_course_daiding_title)
//    private var tv_course_daiding_title: TextView? = null
//
//    @BindView(id = R.id.more_new_daiding, clickable = true)
//    private var more_new_daiding: TextView? = null
//
//    fun onCreate(){
//        val header = layoutInflater.inflate(R.layout.fragment_home_header, null)
//        AnnotationHelper.initBindView(this, header!!)
//    }
}

fun main() {


}
二、反射:

直接看案例

@Target(AnnotationTarget.FIELD)
@Retention(AnnotationRetention.RUNTIME) //注解保留到程序运行时以及会被加载进入到JVM中,所以在程序运行时可以获取到它们
annotation class BindView(val id:Int,val clickable :Boolean = false)  {

}
/**
 * @author :congge
 * @date : 2019/12/10 11:37
 * @desc :绑定控件注解帮助类
 **/
object AnnotationHelper {

    /**
    * @desc : 绑定控件
    * @author : congge on 2019/12/10 11:37
    **/
    fun initBindView(viewClass: Any, view : View){
        // 通过反射获取所有变量名
        val fields = viewClass.javaClass.declaredFields
        for (field in fields){
            //如果变量是在BindView注解上
            if (field.isAnnotationPresent(BindView::class.java)){
                val bindView = field.getAnnotation(BindView::class.java)
                try {
                    //findView
                    val findView :View? = view.findViewById(bindView.id)
                    if (findView != null){
                        //改写为可见属性
                        field.isAccessible = true
                        //向viewClass对象的这个field属性设置新值value
                        field.set(viewClass,findView)
                        //设置点击事件
                        if (bindView.clickable) {
                            findView.setOnClickListener(viewClass as View.OnClickListener)
                        }
                    }

                }catch (e:Exception){
                    e.printStackTrace()
                }


            }
        }

    }
}
整个kotlin教程项目源码结构图:

在这里插入图片描述
有问题或者完整源码的可以看简介联系我,也可以私信我,我每天都看私信的