什么是注解
注解实际上类似标签,例如时间管理大师就是某某的标签,苹果手机就是乔布斯的标签。在代码的世界里,注解就是类、方法、变量...的标签。它可以给特定的代码标注一些额外的信息,然后在不同时期,可以通过某种方式获取标签的信息来处理实际的代码逻辑,这种方式常常就是我们所说的反射。
简单使用
自定义注解
注解格式 annotation class 注解名(注解属性:属性类型)
/**
* 路由注解
*/
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class Route(val path:String)
注解使用
@Route("/main/route")
class RouteActivity:FragmentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
}
处理注解
class RouterUtils {
fun skipActivity(acy:Activity){
val annotation:Route? = acy.javaClass.getAnnotation(Route::class.java)
annotation?.let {
println(it.path)
//根据path 跳转界面
}
}
}
主要就是通过类反射获取注解信息,然后进行下一步操作。
元注解
什么是元注解
注解的注解或者说注解的标签。
元注解有:
@Retention:注解保留的生命周期
@Target:注解对象的作用范围。
@Inherited:@Inherited标明所修饰的注解,在所作用的类上,是否可以被继承。
@Documented:如其名,javadoc的工具文档化,一般不关心。
- @Retention
Retention说标明了注解被生命周期,对应RetentionPolicy的枚举,表示注解在何时生效:
SOURCE:只在源码中有效,编译时抛弃,如@Override,源码期会检验你重写是否正确
CLASS:编译class文件时生效。例如butterknife生成java文件等
RUNTIME:运行时才生效。注解会保留到运行时, 因此使用反射来解析注解
- @Target
Target标明了注解的适用范围,对应ElementType枚举,明确了注解的有效范围。
TYPE:类、接口、枚举、注解类型。
FIELD:类成员(构造方法、方法、成员变量)。
METHOD:方法。
PARAMETER:参数。
CONSTRUCTOR:构造器。
LOCAL_VARIABLE:局部变量。
ANNOTATION_TYPE:注解。
PACKAGE:包声明。
TYPE_PARAMETER:类型参数。
TYPE_USE:类型使用声明
@Inherited 是否可以被继承,默认为false
@Documented 是否会保存到 Javadoc 文档中
Android注解
Android注解给我们提供了三种主要和其他注释供我们使用:
IntDef和StringDef注解;
资源类型注解;
Null注解;
其他实用注解