注解
内置注解
| 注解 | 作用 | 描述 |
|---|---|---|
| @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 中 |
自定义注解
- 注解的属性可以是 8 中基本类型、String、Class、枚举、注解,或这些类型的一维数组
- 属性定义规则:
类型 属性名() default 默认值,默认值可选 - 数组属性用大括号赋值,逗号隔开
@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()));

浙公网安备 33010602011771号