【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教程项目源码结构图:
有问题或者完整源码的可以看简介联系我,也可以私信我,我每天都看私信的