注解

内置注解

注解 作用 描述
@Override 用于标记方法覆盖父类的方法
@Deprecated 标记已过时的方法或类,建议不再使用
@SafeVarargs 用于抑制参数安全性警告 注解只能用于静态方法或 final 实例方法
@FunctionalInterface 标记接口为函数式接口 只有一个抽象方法的接口
@SuppressWarnings 抑制编译器警告 all,抑制所有警告
boxing,抑制与封装/拆装作业相关的警告
cast,抑制与强制转型作业相关的警告
dep-ann,抑制与淘汰注释相关的警告
deprecation,抑制与淘汰的相关警告
fallthrough,抑制与switch陈述式中遗漏break相关的警告
finally,抑制与未传回finally区块相关的警告
hiding,抑制与隐藏变数的区域变数相关的警告
incomplete-switch,抑制与switch陈述式(enum case)中遗漏项目相关的警告
javadoc,抑制与javadoc相关的警告
nls,抑制与非nls字串文字相关的警告
null,抑制与空值分析相关的警告
rawtypes,抑制与使用raw类型相关的警告
resource,抑制与使用Closeable类型的资源相关的警告
restriction,抑制与使用不建议或禁止参照相关的警告
serial,抑制与可序列化的类别遗漏serialVersionUID栏位相关的警告
static-access,抑制与静态存取不正确相关的警告
static-method,抑制与可能宣告为static的方法相关的警告
super,抑制与置换方法相关但不含super呼叫的警告
synthetic-access,抑制与内部类别的存取未最佳化相关的警告
sync-override,抑制因为置换同步方法而遗漏同步化的警告
unchecked,抑制与未检查的作业相关的警告
unqualified-field-access,抑制与栏位存取不合格相关的警告
unused,抑制与未用的程式码及停用的程式码相关的警告
@Target 指定注解可以应用的程序元素类型 ElementType.TYPE, 类、接口、枚举类
ElementType.FIELD, 成员变量(包括:枚举常量)
ElementType.METHOD, 成员方法
ElementType.PARAMETER, 方法参数
ElementType.CONSTRUCTOR, 构造方法
ElementType.LOCAL_VARIABLE, 局部变量
ElementType.ANNOTATION_TYPE, 注解类
ElementType.PACKAGE, 可用于修饰:包
ElementType.TYPE_PARAMETER, 类型参数,JDK 1.8 新增
ElementType.TYPE_USE 使用类型的任何地方,JDK 1.8 新增
@Retention 指定注解的保留策略,即在何时有效 RetentionPolicy.SOURCE, 源文件保留(java 文件)
RetentionPolicy.CLASS, 编译期保留,默认值(class 文件)
RetentionPolicy.RUNTIME 运行期保留(运行时也存在)
@Inherited 指定注解是否可以被子类继承 A 类使用了某个注解,A 的子类是否能继承这个注解
@Documented 指定注解将被包含在 Javadoc 中

自定义注解

  1. 注解的属性可以是 8 中基本类型、String、Class、枚举、注解,或这些类型的一维数组
  2. 属性定义规则:类型 属性名() default 默认值,默认值可选
  3. 数组属性用大括号赋值,逗号隔开
@Target(value = {ElementType.METHOD})// 只能标注在方法上
@Retention(RetentionPolicy.RUNTIME)// 运行时有效
@Documented 
@Inherited 
@interface MyAnnotation {
    String name() default "";
    int age() default 0;
    String[] schools(); // String 类型数组
}

// 使用注解
public class Student{
    @MyAnnotation(age=18, schools={"小学","中学","大学"})
    public void testAnno(){}
}

默认属性

当注解只有一个属性时,并且属性名是 value,赋值时可以省略属性名

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, MODULE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}

@SuppressWarnings("unchecked")  // 等价于 @SuppressWarnings(value = "unchecked")
public void doSomething() {}

属性别名

这是 spring 的不是 jdk 的

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@RequestMapping
public @interface GetMapping {
    /**
     * 真正的定义是继承自 @RequestMapping 的 path/value 别名对
     * 而不是直接在 @GetMapping 中重新声明
     */
    @AliasFor(annotation = RequestMapping.class, attribute = "path")
    String[] value() default {};

    @AliasFor(annotation = RequestMapping.class, attribute = "value")
    String[] path() default {};
}

// 以下两种写法完全等效
@GetMapping(value = "/info")   // 通过value设置@RequestMapping.path
@GetMapping(path = "/info")    // 通过path设置@RequestMapping.value
public String example() { ... }

注解解析

Class<Student> clazz = Student.class;

// 是否有 MyAnnotation 注解,存在则返回 true,否则返回 false,@Retention 不能是 RetentionPolicy.RUNTIME
clazz.isAnnotationPresent(MyAnnotation.class);

// 获取 MyAnnotation 注解(继承来的也能获取)
MyAnnotation annotation1 = clazz.getAnnotation(MyAnnotation.class);

// 获取 MyAnnotation 注解(不能获取继承来的,和反射相反,反射的获取字段或方法带了 Declared 能获取继承的)
MyAnnotation annotation2 = clazz.getDeclaredAnnotation(MyAnnotation.class);

// 获取所有注解(可以获取继承来的)
List<MyAnnotation> annotationList = clazz.getAnnotations();

// 打印注解各项值
System.out.println("name:" + annotation.name());
System.out.println("age:" + annotation.age());
System.out.println("schools:" + String.join(", ", annotation.schools()));
posted @ 2023-03-01 21:19  CyrusHuang  阅读(39)  评论(0)    收藏  举报