一.什么是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都是这样