自己学习笔记,仅供自己参考,如有不对欢迎指正
1.source注解,生命周期存活与Java源文件(.java文件)
自定义的source注解 可以用来对 一些方法 或者参数进行约束,比如说指定线程 指定参数类型
2.class注解,生命周期在编译时 .class文件
配合apt 编写注解处理器, 对注解的类或者变量进行解析生成.class文件,进行辅助工作。使用的示例框架如:
arouter
,在注解处理器中生成代码 帮你做 路径和 activity的路由表
butterknife
的注解帮你做findviewbyid的工作
3.runtime注解,生命周期存活于运行时,内存中的字节码
是在runtime时还能存在的,通常配合反射机制,把注解标注的对象拿到进行操作。使用的示例框架如:
retrofit
通过反射机制,拿到注解的接口和接口中的方法,在通过动态代理生成接口的实现类
EventBus3
也支持runtime注解,通过反射机制获取订阅者中被注解标注的方法,然后把类信息和方法信息存入map。
关于EventBus3的实现原理:
参考:https://github.com/Moosphan/Android-Daily-Interview/issues/176
kotlin中注解Annotation.kt类的具体解释:
参考:https://blog.csdn.net/zx_android/article/details/106236304
在kotlin中使用注解的例子
package com.zhboy.myapplication.anotation
//-------------------------------定义注解---------------------------------------
@Target(
//类注释
AnnotationTarget.CLASS,
//属性变量注释
AnnotationTarget.FIELD,
//函数方法注释
AnnotationTarget.FUNCTION,
//方法参数注释
AnnotationTarget.VALUE_PARAMETER
)
@Retention(AnnotationRetention.RUNTIME)
annotation class RequestParam(val name: String, val value: String)
//-------------------------------使用注解---------------------------------------
@RequestParam(name = "这个类用来干啥", value = "泡茶")
class TeaRequest {
@RequestParam(name = "茶的年份", value = "2021年")
private var teaTime: String = "2021年"
/**
* 泡茶
* @param cupColor 水杯颜色
* @param teaType 茶的类型
*/
@RequestParam(name = "方法的作用",value = "泡茶")
private fun makeTea(
@RequestParam(name = "水杯颜色", value = "红色")
cupColor: String,
@RequestParam(name = "茶的类型", value = "红茶")
teaType: String
) {
}
}
//-------------------------------获取注解的值---------------------------------------
//获取类上面的注解
fun getClassAnnotation() {
val clazz = TeaRequest::class.java
val annotation = clazz.getAnnotation(RequestParam::class.java)
println("类注解的值: ${annotation?.name},${annotation?.value}")
}
//获取属性变量的注解
fun getFieldAnnotation() {
val clazz = TeaRequest::class.java
val annotations = clazz.declaredFields
for (annotation in annotations) {
val a = annotation.getAnnotation(RequestParam::class.java)
println("属性变量注解的值: ${a?.name},${a?.value}")
}
}
//获取函数上面的注解
fun getFunctionAnnotation() {
val clazz = TeaRequest::class.java
val annotations = clazz.declaredMethods
for (annotation in annotations) {
val a = annotation.getAnnotation(RequestParam::class.java)
println("函数注解的值: ${a?.name},${a?.value}")
}
}
//获取方法参数上注解的值
fun getParameterAnnotation() {
val clazz = TeaRequest::class.java
val me = clazz.getDeclaredMethod("makeTea", String::class.java, String::class.java)
val parameterAnnotations = me.parameterAnnotations
for (parameters in parameterAnnotations) {
for (param in parameters) {
if (param is RequestParam) {
println("参数注解的值:${param.name},${param.value}")
}
}
}
}
fun testAnnotation(){
getClassAnnotation()
getFieldAnnotation()
getFunctionAnnotation()
getParameterAnnotation()
}
网友评论