Java 注解

1. 标准注解

jdk1.5 版本内置了三种标准的注解:

  • @Override : 表示当前的方法定义将覆盖超类中的方法
  • @Deprecated : 指不赞成使用的代码,被弃用的代码,使用了被它注解的元素时,编译器将发出警告
  • @SuppressWarnings : 关闭不当编辑器警告信息

2. 元注解

元注解是指注解的注解 包括 @Target、@Retention、@Document、@Inherited四种。

  • @Target : 表示该注解可以用于什么地方,比如方法、还是成员变量、还是包等等。传入的是 ElementType 枚举,可选参数有:

    • CONSTRUCTOR : 构造器声明
    • FIELD : 字段或者属性声明
    • LOCAL_VARIABLE : 局部变量声明
    • METHOD : 方法声明
    • PACKAGE : 包声明
    • PARAMETER : 参数声明
    • ANNOTATION_TYPE : 注解类型声明
    • TYPE : 类、接口(包括注解类型)或 enum 声明
  • @Retention : 表示需要在什么级别保存该注解信息,可以简单理解为设置注解的生命周期。传入的是 RetentionPolicy 枚举,一般来说,自定义的注解都是 RUNTIME 级别,配合反射来使用。如果设置为前两个级别,则需要继承 AbstractProcessor 并实现 process()方法,比如 lombok,可选参数包括:

    • SOURCE : 注解仅保留在源码中,并由编译器忽略
    • CLASS : 注解在 class 文件中可用,但会被 JVM 丢弃
    • RUNTIME : JVM 将在运行期间保留注解,因此可以通过反射机制读取注解的信息
  • @Document : 将注解包含在 Javadoc 中

  • @Inherited : 表示一个注解能够被继承

3. 使用方法

jre 中通过 java.lang.reflect.AnnotatedElement 接口实现对注解的解析,其中包含一些用的到的方法:

  • Annotation[] getAnnotations() : 返回此元素上存在的所有注释。如果此元素没有注释,则返回长度为零的数组。该方法的调用者可以随意修改返回的数组,这不会对其他调用者返回的数组产生影响
  • <T extends Annotation> T getAnnotation(Class<T> annotationClass) : 如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null
  • Annotation[] getDeclaredAnnotations() : 返回直接存在于此元素上的所有注释,该方法将忽略继承的注释
  • boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) : 如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。此方法主要是为了便于访问标记注释而设计的。

4. 注解介绍

可以在 javadoc 中实现超链接样式,语法为:

1
2
{@link ClazzName}
{@link ClazzName#methodName(String, Boolean)}

2. @see

在 javadoc 中黑体字声明可以查看的类或方法,语法为:

1
2
@see ClazzName
@see ClazzName#methodName(String, Boolean)

3. @GuardedBy("lock")

这是一个同步锁,只有在线程持有 lock 对象锁时,才能使用这写变量