Java注解(Annotation)笔记

2021-10-08  本文已影响0人  zqyadam

注解(Annotation)概述

注解(Annotation)的示例

使用Annotation时要在其前面增加@符号, 并把该Annotation当成一个修饰符使用,用于修饰它支持的程序元素。

示例一:生成文档相关的注解

其中:

  1. @param @return 和 @exception 这三个标记都是只用于方法的。
  2. @param的格式要求:@param 形参名 形参类型 形参说明
  3. @return 的格式要求:@return 返回值类型 返回值说明
  4. @exception的格式要求:@exception 异常类型 异常说明
  5. @param和@exception可以并列多个
package com.annotation.javadoc;
  /**
  * @author shkstart
  * @version 1.0
  * @see Math.java
  */
public class JavadocTest {
  /**
  * 程序的主方法,程序的入口
  * @param args String[] 命令行参数
  */
  public static void main(String[] args) {
  }
  /**
  * 求圆面积的方法
  * @param radius double 半径值
  * @return double 圆的面积
  */
  public static double getArea(double radius){
    return Math.PI * radius * radius;
  }
}

示例二:在编译时进行格式检查(JDK内置的三个基本注解)

package com.annotation.javadoc;
public class AnnotationTest{
  public static void main(String[] args) {
    @SuppressWarnings("unused")
    int a = 10;
  }
  @Deprecated
  public void print(){
    System.out.println("过时的方法");
  }
  @Override
  public String toString() {
    return "重写的toString方法()";
  }
}

示例三:跟踪代码依赖性,实现替代配置文件功能

自定义注解(Annotation)

自定义注解必须配上注解的信息处理流程(使用反射)才有意义。

  1. 注解声明为@interface
  1. 内部定义成员,通常使用value表示

  2. 可以指定成员的默认值,使用default定义

  3. 如果自定义注解没有成员,表示是一个标识作用

    如果注解有成员,在使用注解时,需要指明成员的值。

JDK中的元注解

JDK的元Annotation用于修饰其他Annotation定义

元注解:对现有的注解进行解释说明的注解。

JDK5.0提供了4个标准的meta-annotation类型,分别是:

Retention

@Retention:只能用于修饰一个Annotation定义, 用于指定该Annotation的生命周期, @Rentention包含一个 RetentionPolicy类型的成员变量,使用@Rentention时必须为该value成员变量指定值:

RetentionPolicy对象的定义

public enum RetentionPolicy{
  SOURCE,
  CLASS,
  RUNTIME
}

使用@Retention

@Retention(RetentionPolicy.SOURCE)
@interface MyAnnotation1{ }

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{ }

Target

@Target:用于修饰Annotation定义,用于指定被修饰的Annotation能用于修饰哪些程序元素@Target也包含一个类型ElementType[],名为value的成员变量。

ElementType是一个枚举类,包含下面👇的对象。

ElementType的定义如下👇:

public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,

    /** Field declaration (includes enum constants) */
    FIELD,

    /** Method declaration */
    METHOD,

    /** Formal parameter declaration */
    PARAMETER,

    /** Constructor declaration */
    CONSTRUCTOR,

    /** Local variable declaration */
    LOCAL_VARIABLE,

    /** Annotation type declaration */
    ANNOTATION_TYPE,

    /** Package declaration */
    PACKAGE,

    /**
     * Type parameter declaration
     *
     * @since 1.8
     */
    TYPE_PARAMETER,

    /**
     * Use of a type
     *
     * @since 1.8
     */
    TYPE_USE
}

@Target的定义👇

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    /**
     * Returns an array of the kinds of elements an annotation type
     * can be applied to.
     * @return an array of the kinds of elements an annotation type
     * can be applied to
     */
    ElementType[] value();
}

@Target的使用

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})

👆上面的代码表示可以修饰类型(类、接口)、属性、方法、参数、构造器、局部变量

Documented(出现频率较低)

@Documented: 用于指定被该元 Annotation修饰的Annotation类将被javadoc工具提取成文档。

默认情况下,javadoc是不包括注解的。

定义为Documented的注解必须设置Retention值为RUNTIME。

例如@Deprecated注解,在API文档中会显示。

Inherited(出现频率较低)

@Inherited:被它修饰的Annotation将具有继承性。如果某个类使用了被@Inherited修饰的Annotation, 则其子类将自动具有该注解。

通过反射获取注解信息(未完待续)

JDK8中注解的新特性

Java 8对注解处理提供了两点改进:可重复的注解可用于类型的注解。此外,反射也得到了加强,在Java8中能够得到方法参数的名称。这会简化标注在方法参数上的注解。

可重复注解示例

类型注解

JDK1.8之后,关于元注解@Target的参数类型ElementType枚举值多了两个:TYPE_PARAMETERTYPE_USE

在Java1.8之前,注解只能是在声明的地方所使用,Java1.8开始,注解可以应用在任何地方。

例:

TYPE_PARAMETER

TYPE_USE

上一篇下一篇

猜你喜欢

热点阅读