【笔记】Java的注解

前言

Java的注解学习笔记

JDK内置注解

标注方法表示这是重写方法

1
2
@Override
void method() {}

标注方法表示方法已过时

1
2
@Deprecated
void method() {}

标注类或方法表示屏蔽警告

屏蔽指定警告

1
2
@SuppressWarnings("unused")
void method() {}

屏蔽全部警告

1
2
@SuppressWarnings("all")
void method() {}

标注接口表示这是函数式接口

1
2
@FunctionalInterface
interface Inf {}

定义注解

1
@interface 注解名 {}

注解上定义元注解

元注解,元注解是标注注解的注解

@Retention:定义注解的生命周期

RetentionPolicy.SOURCE:定义这是一个源码注解
RetentionPolicy.CLASS:定义这是一个编译注解
RetentionPolicy.RUNTIME:定义这是一个运行时注解

@Documented:动态生成文档,通过javadoc <name>.java根据注解生成文档
@Target:定义注解的使用范围

ElementType.TYPE:作用于类上
ElementType.FIELD:作用于字段上
ElementType.METHOD:作用于方法上
ElementType.PARAMETER:作用于形参上
ElementType.CONSTRUCTOR:作用于构造器上
ElementType.LOCAL_VARIABLE:作用于局部变量上
ElementType.ANNOTATION_TYPE:作用于注解上
ElementType.PACKAGE:作用于包上
ElementType.TYPE_PARAMETER:作用于类型参数上
ElementType.TYPE_USE:作用于类型类型使用上

@Inherited:在标注的类的子类中可以继承注解
@Repeatable:定义注解可重复使用

1
2
@Target(ElementType.TYPE)
@interface 注解名 {}

注解中定义属性

1
2
3
4
@interface 注解名 {
String 属性名1();
int 属性名2();
}

默认值

1
2
3
4
@interface 注解名 {
String 属性名1() default "默认值";
int 属性名2() default 0;
}
数组默认值
1
2
3
4
@interface 注解名 {
String[] 属性名1() default {"默认值", "默认值"};
int[] 属性名2() default {0, 0};
}

注解作为其他注解的属性类型

1
2
3
@interface 注解名 {
注解名 属性名();
}

默认属性

1
@interface 注解名 {}
  • 如果注解中没有定义任何属性,那么仍然存在一个默认属性value(),它的默认值为空
1
2
3
@interface 注解名 {
String value() default "";
}

使用注解

  • 如果使用注解时,注解有定义属性,则使用时必须指定属性值
  • 属性值必须为字面量或常量
1
2
3
4
5
6
7
8
9
@interface 注解名 {
String 属性名1();
String 属性名2();
}

final String VALUE = "属性值";

@注解名(属性名1 = "属性值", 属性名2 = VALUE)
class 类名 {}
  • 通过{}传递数组类型的属性值
1
2
3
4
5
6
@interface 注解名 {
String[] 属性名();
}

@注解名(属性名 = {"属性值", "属性值"})
class 类名 {}
  • 数组中只有一个属性值,可以省略{}
1
2
3
4
5
6
@interface 注解名 {
String[] 属性名();
}

@注解名(属性名 = "属性值")
class 类名 {}
  • 属性只有一个,且属性名为value()时,可以省略属性名
1
2
3
4
5
6
@interface 注解名 {
String value();
}

@注解名("属性值")
class 类名 {}
  • 属性有默认值时,可以通过省略属性传值,使用默认值
1
2
3
4
5
6
7
@interface 注解名 {
String 属性名1() default "默认值";
String 属性名2();
}

@注解名(属性名2 = "属性值")
class 类名 {}
  • 如果所有属性都使用默认值时,可以省略()
1
2
3
4
5
6
7
@interface 注解名 {
String 属性名1() default "默认值";
String 属性名2() default "默认值";
}

@注解名
class 类名 {}

注解当作参数类型

1
void method(注解名 注解变量名) {}
  • 获取注解属性值
1
属性类型 属性变量名 = 注解变量名.属性名();

通过反射获取注解

传送门

完成