Annotation 注解

本文深入探讨了Java中自定义注解的定义、使用、参数设置、默认值设定、枚举取值范围以及保留范围的配置。通过具体示例展示了如何在类、方法、字段上应用注解,并说明了不同保留范围的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


定义简单的Annotation

Annotation的定义格式:

Java代码收藏代码
  1. [public]@interfaceAnnotation名称{
  2. 数据类型变量名称();
  3. }

定义一个简单的Annotation

Java代码收藏代码
  1. public@interfaceMyDefaultAnnotationNoneParam{
  2. }

之后就可以直接在程序中使用”@Annotation名称的格式。

Java代码收藏代码
  1. @MyDefaultAnnotationNoneParam
  2. publicclassAnnotationTest{
  3. }

此时就表示在AnnotationTest类上使用Annotation

还可以在Annotation中设置,使用变量接收参数

Java代码收藏代码
  1. public@interfaceMyDefaultAnnotationSingleParam{
  2. publicStringvalue();//接收设置的内容
  3. }

在使用的时候就必需清楚地指明变量的内容

Java代码收藏代码
  1. @MyDefaultAnnotationSingleParam("陈洲")
  2. publicclassAnnotationTest{
  3. }

或者也可以使用明确的标记,表示内容赋给哪个参数

Java代码收藏代码
  1. @MyDefaultAnnotationSingleParam(value="陈洲")
  2. publicclassAnnotationTest{
  3. }

也可以同时设置多个参数

Java代码收藏代码
  1. public@interfaceMyDefaultAnnotationMoreParam{
  2. publicStringkey();
  3. publicStringvalue();
  4. }

Annotation在使用的时候需要设置两个参数,一个是key,另外一个是value

Java代码收藏代码
  1. @MyDefaultAnnotationMoreParam(key="name",value="陈洲")
  2. publicclassAnnotationTest{
  3. }

也可以使用数组当做Annotation的属性

Java代码收藏代码
  1. public@interfaceMyDefaultAnnotationArrayParam{
  2. publicString[]value();
  3. }

接收的内容本身是一个数组类型,所以要传递数组参数

Java代码收藏代码
  1. @MyDefaultAnnotationArrayParam(value={"China","America"})
  2. publicclassAnnotationTest{
  3. }

以上所定义的全部Annotation有一个特点,所有的参数内容需要在使用注释时设置上去,那么也可以为一个参数设置默认的内容,在声明的时候使用default即可。

Java代码收藏代码
  1. public@interfaceMyDefaultAnnotationValue{
  2. publicStringkey()default"name";//指定好了默认值
  3. publicStringvalue()default"chenzhou";//指定好了默认值
  4. }

当再去使用此Annotation时就不用设置值了

Java代码收藏代码
  1. @MyDefaultAnnotationValue
  2. publicclassAnnotationTest{
  3. }

没有设置内容,编译也不会出现任何错误。

在操作中,对于一个Annotation而言有时候会固定其取值范围,只能取固定的几个值,那么这个时候实际上就需要依靠枚举。

Java代码收藏代码
  1. publicenumNames{
  2. CHENZHOU,GONGYONG,YIXIN,
  3. }

以后的Annotation取值,只能从这三个值中取走。

Java代码收藏代码
  1. public@interfaceMyDefaultAnnotationEnum{
  2. publicMyNamename()defaultMyName.CHENZHOU;//指定默认值
  3. }

此时以上的Annotation已经设置好了一个枚举中的内容作为默认值,那么外部使用此Annotation的时候也需要从枚举固定取值

Java代码收藏代码
  1. @MyDefaultAnnotationEnum(name=MyName.CHENZHOU)
  2. publicclassAnnotationTest{
  3. }

Retention和RetentionPolicy

在Annotation,可以使用Retention定义一个Annotation的保存范围,此Annotation的定义如下:

Java代码收藏代码
  1. @Documented
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Target(ElementType.ANNOTATION_TYPE)
  4. public@interfaceRetention{
  5. RetentionPolicyvalue();
  6. }

在以上的Retention定义中存在一个RetentionPolicy类型的变量,此变量用于指定Annotation的保存范围,RetentionPolicy包含三种范围

RetentionPolicy的三种范围

No.

范围

描述

1

SOURCE

此Annotation类型的信息只会保存在程序源文件中(*.java),编译之后不会保存在编译好的类文件(*.class)之中

2

CLASS

此Annotation类型的信息会保存在程序源文件(*.java)和编译好的类文件(*.class)之中,在使用此类的时候,这些Annotation的信息将不会被加载到虚拟机JVM之中,如果一个Annotation声明时没有指定范围,则默认是此范围

3

RUNTIME

此Annotation类型的信息会保存在程序源文件(*.java)和编译好的类文件(*.class)之中,在执行时也会加载到JVM中

在三种范围中,最需要关心的就是RUNTIME范围,因为在执行的时候起作用。

使用Retention指定一个Annotation的范围,范围为RUNTIME

Java代码收藏代码
  1. @Retention(value=RetentionPolicy.RUNTIME)//表示此Annotation在运行时有效
  2. public@interfaceMyDefaultRetentionAnnotation{
  3. publicStringname()default"chenzhou";
  4. }

此Annotation可以在运行时起作用

内建Annotation的RetentionPolicy

  • Override定义采用的是@Retention(value=SOURCE),只能在源文件中出现
  • Deprecated定义采用的是@Retention(value=RUNTIME),可以在执行时出现。
  • SuppressWarnings定义采用的是@Retention(value= SOURCE),只能在源文件中出现

Documented 标记
这个annotation非常简单,也非常容易理解,使用过javadoc命令的人都会很清楚,我们可以用javadoc命令将方法,类,变量等前面的注释转换成文档,在默认的情况下javadoc命令不会将我们的annotation生成再doc中去的,所以使用该标记就是告诉jdk让它也将annotation生成到doc中去,比如

Java代码收藏代码
  1. @Documented
  2. public@interfaceRetention{
  3. RetentionPolicyvalue();
  4. }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值