一.认识注解
1.注解(Annotation),是一种元数据(用来描述数据的数据),它们可以在Java源代码中添加额外的信息,这些信息可以被编译器、工具和运行时环境使用。Java注解可以用来提供类、方法、字段或其他程序元素的附加信息,以及在编译时执行某些任务。
2.注释(Comment)与注解(Annotation)的差别
//学习
public void study(){}
@Override
public void study(){}
(1)注释(Comment)是给人看的,用于对程序逻辑做出解释,并不作为程序的一部分,对程序的执行并不造成任何影响。程序在被编译成.class字节码文件时会删去注释内容。
(2)注解(Annotation)既是给人看的,也是给编译器看的,注解既能对程序做出解释(和注释功能相同),又能被编译器读取并执行相应功能,是程序的一部分。
二.使用注解
注解可以分为三类,分别是内置注解、元注解和自定义注解。
1.内置注解
内置注解是jdk已经定义好释义的注解,开发者可直接使用,有三种。
(1)@Override:表示要重写父类的方法
(2)@Deprecated:表示该方法已经废弃,不建议使用。(只是不建议,但还是能用)
(3)@SuppressWarnings:用来抑制编译时的警告信息,需传递参数。
@SuppressWarnings("all"):表示抑制所有警告信息
@SuppressWarnings("unchecked"):表示抑制未检查的警告信息
2.元注解meta-annotation
元注解是用于注释注解的注解,需要对自定义注解进行注解时,就使用元注解,有四种。
(1)@Target():表明注解的适用对象,需传递参数。
@Target(value = ElemType.METHOD):表明该自定义注解仅适用于方法
当适用对象有多个时,传递的参数是一个集合
@Target(value = {ElemType.METHOD, ElemType.TYPE}):表明该自定义注解适用于方法和类。
(2)@Retention():表明注解的存活周期,即注解能保留到什么时候,需传递参数。
@Retention(value = RetentionPolicy.SOURCE):注解只能存活在编辑时的源码
@Retention(value = RetentionPolicy.CLASS):注解能存活到编译后的类
@Retention(value = RetentionPolicy.RUNTIME):注解能存活到程序成功运行完毕
存活时间:SOURCE < CLASS < RUNTIME ,一般是使用RUNTIME
(3)@Document:表明该注解将JavaDoc中。
(4)@Inherited:表明该类的子类可以继承此注解
3.自定义注解
开发人员可以自己编写一个注解,但Java对自定义注解的编写做出规范。
(1)自定义注解的格式:权限修饰符 + @interface + 注解名 + {定义内容}
public @interface MyAnnotation {}
自定义注解跟自定义接口的格式是一样的,因为注解本质就是一个继承Annotation接口的特殊接口。
(2)定义注解元素的格式:参数类型 + 参数名 + ();
public @interface MyAnnotation {
String name();
}
定义注解元素的格式跟定义接口中抽象方法的格式是一样的,但在定义注解元素时还可以加入默认值。
(3)定义注解元素的默认值:注解元素一定要有值,若注解内未定义默认值,则使用注解时一定要传值。定义有默认值的注解元素的格式为:参数类型 + 参数名 + () default + 值
public @interface MyAnnotation1 {
String name() default "ZhangSan";
String number() default ""
int age();
String[] schools() default {"S1","S2"};
}
经常使用空字符串、数字0来作为默认值,若默认值为-1则代表该元素不存在。
(4)若注解元素只有一个,则默认定义参数名为value;当参数只有value时,使用注解时传值可以直接写,而不用value = ;
public @interface MyAnnotation2 {
String value() default "";
}
(5)使用
//用元注解Target来声明自定义注解MyAnnotation1的使用范围
@Target(ElemType.TYPE)
//接下来是自定义注解MyAnnotation1
@interface MyAnnotation1 {
String name() default "ZhangSan";
String number() default ""
int age();
String[] schools() default {"S1","S2"};
}
//使用自定义注解MyAnnotation1来注解类。MyAnnotation1中的注解元素只有age没有默认值,因此只需传age的值
@MyAnnotation1(age = 18)
public void Student{}
//用元注解Target来声明自定义注解MyAnnotation2的使用范围
@Target(ElemType.TYPE)
//接下来是自定义注解MyAnnotation2
@interface MyAnnotation2 {
String value();
}
//使用自定义注解MyAnnotation2来注解类。
/*
*MyAnnotation2的元素只有一个,所以命名为value,
*value没有默认值,所以使用注解时要传值
*而当命名为value时,传值无需写value =
*/
@MyAnnotation2("GOOD")
public void Student{}