Java 注解的几大作用及使用方法详解

Java 注解,从名字上看是注释,解释。但功能却不仅仅是注释那么简单。注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后某个时刻方便地使用这些数据(通过 解析注解 来使用这些数据),常见的作用有以下几种:
  • 生成文档。这是最常见的,也是java 最早提供的注解。常用的有@see @param @return 等
  • 跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量。也是
  • 在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。

java.lang.annotation 中包含所有定义自定义注解所需用到的原注解和接口。如接口 java.lang.annotation.Annotation 是所有注解继承的接口,并且是自动继承,不需要定义时指定,类似于所有类都自动继承Object。

该包同时定义了四个元注解,Documented,Inherited,Target(作用范围,方法,属性,构造方法等),Retention(生命范围,源代码,运行时)。

Inherited

        表示一个Annotation能否被使用其类的子类继续继承下去,如果没有写此注释,则此Annotation根本就是无法继承的。

Documented

         @Documented 将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。

Target

因为可以在任意的位置上使用自定义的Annotation,则在操作的时候就会出现一些问题,例如:一些Annotation只希望在方法的声明上使用,那么此时,就必须设置Annotation的作用范围。

@Target注释中,存在ElementType类型的变量。

在此变量中存在七种范围:

  • 只能在Annotation中出现(注释类声明)public static final ElementType ANNOTATION_TYPE
  • 只能在构造方法中出现(构造方法声明)public static final ElementType CONSTRUCTOR
  • 局部变量()public static final ElementType LOCAL_VARIABLE
  • 只能在方法上使用(方法声明)public static final ElementType METHOD
  • 在参数声明上使用:public static final ElementType PARAMETER
  • 在包声明上使用:public static final ElementType PACKAGE
  • 类、接口(包括注释类型)或枚举声明public static final ElementType TYPE
RetentionRetentionPolicy

         在java.lang.annotation包中定义了所有的与Annotation有关的操作,先观察Retention

         Retention本身是一个Annotation,其中的取值是通过RetentionPolicy这个枚举类型指定的范围。

RetentionPolicy中规定了以下的三个取值范围:

  • 只在编译之后的class中起作用:public static final RetentionPolicy CLASS
  • 只在运行的时候起作用:public static final RetentionPolicy RUNTIME
  • 只在源代码中起作用:public static final RetentionPolicy SOURCE

如果一个Annotation要想起作用,则必须使用RUNTIME范围。

反射与Annotation

        一个Annotation如果要想起作用,则肯定要依靠反射机制。通过反射可以取得在一个方法上声明的Annotation的全部内容。

        在FieldMethodConstructor的父类java.lang.reflect.AccessibleObject上定义了以下与Annotation反射操作相关的方法:

  • 取得全部的Annotation:Annotation[] getAnnotations()
  • 取得特定的Annotationpublic <T extends Annotation> T getAnnotation(Class<T> annotationClass)
  • 判断操作的是否是指定的Annotationpublic boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)

注意:要想自定义有Annotation生效,必须使用“@Retention(value = RetentionPolicy.RUNTIME)”。

你可能感兴趣的:(Java 注解的几大作用及使用方法详解)