Java注解-学习笔记

71 阅读2分钟

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;
 }

属性

注解本质上既然是一个接口,那么其属性和接口就一样(属性一般都是抽象方法,常量没啥用)

返回值类型要求:

  1. 基本数据类型

     public abstract int test1(); // public abstract默认可不写
    
  2. String类型

     public abstract String test1(); // public abstract默认可不写
    
  3. 枚举类型

  4. 注解类型

  5. 这些类型的数组

     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的值)