一.什么是Java注解(Annotation)
先区别注释(comment)和注解:
注释:是解释给人看的,可以对程序作出一些解释
注解:也是给人看的,可以对程序作出一些解释,更重要的是给编译器看和解释,可以被编译器读取
注解是JDK 5.0引入的技术
从字面意思来看就是注释、解释。但是实际不仅仅是这样。
注解的格式
"@注释名" 还可以添加一些参数名 如:@suppressWarnings("unchecked")
可以在哪里使用:
package class method field 相当于给他们增加了额外的辅助信息,可以通过反射对这些元数据进行访问
内置注解
Override:只用于修饰方法,表示方法重写,另外有检查报错的作用
Deprecated:只用于修饰类、方法和属性,表示废弃,不鼓励程序员使用,但是可以使用,通常它有危险或者有更好的替代方法
SuppressWarnings:抑制编译时的警告,需要加一个参数才能使用,这些参数是设定好的,"all"、"unchecked"等
元注解(meta-annotation):负责对注解作注解也就是定义其他注解:用来对其他annotation类型作说明
@Target:注解使用的范围(被描述的注解用在什么地方 ) 方法 、类 、参数 构造方法等
@Retention:在什么级别保留该注释信息,用于描述注解的生命周期 SOURCE<CLASS<RUNTIME 我们一般都是runtime
@Document:该注解将被包含在javadoc中
@Inherited:说明子类可以继承父类中的该注解
自定义注解:一般会用到@Target和@Retention
@Retention(RUNTIME)//使用生命周期
@Target(PARAMETER)//使用范围
public @interface MyAnnotation{
//注解值的名称和类型
String value();参数名称是name,类型是string数组,value="6"
String[] name();//参数名称是name,类型是string数组,使用的时候是 name={"我的", "你还"}
int age() default 0; //使用的时候该值不写的话默认值是0 使用的时候是 age=6
}
@MyAnnotation(value="6", name={"wo", "mo"}, age=7)
public void test(){
}
如果注解只有一个值 并且值的名称为value 使用的时候可以省略value= 例如:
@Retention(RUNTIME)//使用生命周期
@Target(PARAMETER)//使用范围
public @interface MyAnnotation1{
//注解值的名称和类型
String value() defaulte;参数名称是name,类型是string数组,value="6"
}
使用
@MyAnnotation(“6“),有默认值可以直接不写 @MyAnnotation()
注解如何读取:用反射机制去读取,一般框架都是注解和反射
第三方框架库都是自定义注解,可以通过反射拿到 类、字段field、方法method和方法的形参的注解 。通过注解可以对他们做出一些处理 。比如Rxjava、Retrofit 、EventBus、GreenDao都是这样
参考:https://blog.csdn.net/yangjizhao/article/details/51399452
https://www.bilibili.com/video/BV1p4411P7V3?from=search&seid=12224755193752059853