1 JDK中预定义的一些注解
@Override:检测该注解标注的方法是否继承自父类
@Deprecated:被该注解标注的内容已过时(有更好的方法了),不推荐使用,但也能使用,但不是删掉低版本的方法。既兼容低版本,也推荐使用高版本的方法
@SupressWarnings:压制警告(告诉编译器对被注解作用域的内部警告保持静默)通常在类或方法的前一行写上@SupressWarnings("all"),IDEA就不会报警告
2 自定义注解
本质:一个Java接口,继承自java.lang.annotation.Annotation
格式:
元注解:用于描述该注解的注解
经常使用的四个元注解:
@Target:描述该注解的作用位置。可以作用于类、属性还是方法中
@Target({ElementType.TYPE, ElementType.METHOD}) // TYPE:可作用于类上;METHOD:方法上;FIELD:成员变量上
@Retention:描述该注解被保留的阶段(SOURCE, CLASS, RUNTIME)
@Retention(RetentionPolicy.RUNTIME) // 自己写的注解一般都保留到RUNTIME阶段
@Documented:该注解是否被抽取到API文档中
@Inherited:描述注解是否被子类继承(若注解加了@Inherited,父类使用了该注解,则子类自动继承该注解)
元注解
public @interface MyAnnotation {
// 属性列表
String name();
int age();
Gender gender(); // Gender枚举类型
String[] friends;
}
属性:
注解本质上既然是一个接口,那么其属性和接口就一样(属性一般都是抽象方法,常量没啥用)
返回值类型要求:
-
基本数据类型
public abstract int test1(); // public abstract默认可不写 -
String类型
public abstract String test1(); // public abstract默认可不写 -
枚举类型
-
注解类型
-
这些类型的数组
String[] names(); // 数组赋值时用{},如@MyAnnotation(names={"张三", "李四", "王五"})
使用:
// MyAnnotation.java
public @interface MyAnnotation {
String name();
int age();
String id() default "123456"; // 当注解属性赋值忘记给id赋值时,id就使用default值
}
// 其它类中
@MyAnnotation(name = "张三", age = 21, id = "123456") // 注解的属性要赋值
public class Blablabla{}
!!!注意:
若注解只有一个属性,并且该属性叫做value,则给注解的属性赋值时可以直接
@MyAnnotation(value的值)