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
Retention和RetentionPolicy

         在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的全部内容。

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值