Java的自定义注解——Annotation的使用

本文介绍了Java中自定义注解的使用,包括如何定义Annotation类型,添加成员及默认值,以及如何通过反射访问注解信息。讲解了元注解@Target和@Retention的作用,@Target用于指定注解适用的程序元素,@Retention控制注解的保留策略。还提供了一个实例,展示了如何在实际代码中应用自定义注解。

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

Annotation——自定义注解

Java中提供了 Annotation 功能,该功能可用于类,构造方法,成员变量,方法。参数等的声明中。该功能不会影响程序的运行,但是会对编译器警告等辅助工具产生影响。

定义 Annotation 类型

在定义 Annotation 类型时,需要用到用来定义接口的 interface 关键字,但需要在 interface 关键字前面加一个 “ @ ” 符号,即定义 Annotation 类型的关键字为@interface 。

public @interface MyAnnotation {
   

}

这样就是定义了一个 Annotation 类型。上面定义的 Annotation 类型未包含任何成员,为 Annotation 类型添加成员。

public @interface MyAnnotation {
   
	String name();
	Class type();
}

在为 Annotation 类型定义成员时,也可以为成员设置默认值。

public @interface MyAnnotation {
   
	String name() default "默认值";
	Class type() default void.class;
}
访问 Annotation 信息

可以通过反射注解,来访问 Annotation 信息,想要反射注解还需要了解一下元注解。元注解就是为其他注解做注解,也就是注解的注解。元注解有四个,常用的有两个 @Target 和 @Retention 。
在这里插入图片描述

@Target

在定义 Annotation 时,可以通过 @Target 来设置 Annotation 适用的程序元素种类,如果为设置 @Target ,则表示适用于所有程序元素。枚举类 ElementType 中的枚举常量用来设置 @Target。
枚举类 ElementType 中的枚举常量

枚举常量 说明
ANNOTATION_TYPE 表示用于 Annotation 类型
TYPE 表示用于类,接口和枚举,以及Annotation 类型
CONSTRUCTOR 表示用于构造方法
FIELD 表示用于成员变量和枚举变量
METHOD 表示用于方法
PARAMETER 表示用于参数
LOCAL_VARIABLE 表示用于局部变量
PACKAGE 表示用于包
@Retention

通过设置 Annotation 类型的 @Retention ,可设置 Annotation 的有效范围。枚举类 RetentionPolicy 中的枚举常量用来设置 @Retention ,如果未设置 @Retention ,Annotation 的有效范围为枚举常量 CLASS 表示的范围。
枚举类 RetentionPolicy 中的枚举常量

枚举常量 说明
SOURCE 表示不编译 Annotation 到类文件中,有效范围最小
CLASS 表示编译 Annotation 到类文件中,但是在运行时不加载 Annotation 到JVM中
RUNTIME 表示在运行时加载 Annotation 到JVM中,有效范围最大

之前反射的三个类 Constructors (构造方法类),Field (成员属性类),Methods (成员方法类)都提供的可以反射注解的方法。

### 如何在Java中创建和使用自定义注解 #### 创建注解型 为了创建一个新的注解,需要使用 `@interface` 关键字来声明一个接口样式的结构[^1]。例如: ```java public @interface MyCustomAnnotation { String value(); } ``` 此代码片段展示了最简单的自定义注解形式,其中包含了一个名为 `value` 的成员。 #### 使用注解修饰自定义注解 为了让自定义注解更加灵活多变,在定义时还可以应用一些预设好的元注解,比如 `@Retention`, `@Target`, 和 `@Documented` 等等[^3]。下面是一个更复杂的例子: ```java import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface LogOperation { String value() default "default operation"; } ``` 这里设置了两个重要的特性:一是保留策略为运行时期间有效;二是目标仅限于方法上。 #### 应用自定义注解或方法 一旦完成了上述工作,则可以在任何合适的位置运用这个新建立起来的标签。如下所示是在某个业务逻辑函数前加上了之前定义过的日志记录操作说明[^4]: ```java public class TestClass { @LogOperation("新增") public void save(){ System.out.println("Saving data..."); } } ``` 这段代码表示当调用了 `save()` 函数之后将会触发相应的日志行为——即打印一条消息指出正在进行保存动作。 #### 反射机制读取注解信息 最后一步就是借助反射技术去访问那些已经附加给特定组件上的标记及其携带的数据项。这通常发生在应用程序启动阶段或是某些特殊条件下才会被执行的操作之中[^5]。考虑这样一个场景,我们想要遍历所有带有指定型的字段,并提取其对应的描述文字: ```java Field[] fields = clazz.getDeclaredFields(); for (Field field : fields){ if(field.isAnnotationPresent(Excel.class)){ Excel excelAnno = field.getAnnotation(Excel.class); String name = excelAnno.name(); // 获取注解中的name属性值 ... } } ``` 以上过程概括了整个流程,从设计自己的注解直到最终解析它们的内容为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值