java中定义自定义注解本质是用@interface声明的特殊接口,用于添加元数据,支持元素、元注解(@target、@retention等)配置,编译后生成.class文件并被jvm识别为annotation子类型。

在 Java 中定义自定义注解,本质是创建一个特殊的接口,用 @interface 关键字声明。它不是类或抽象类,而是一种编译期的元数据标记,用于为代码附加额外信息,供编译器、工具或运行时通过反射读取和处理。
基础语法:如何声明一个自定义注解
最简形式只需一行:
@interface MyAnnotation {
}
这会生成一个名为 MyAnnotation 的注解类型,使用时写作 @MyAnnotation。注意:
- 注解名建议以大写字母开头,符合接口命名规范;
- 定义必须放在 .java 文件中,不能嵌套在类内部(除非是 static 嵌套接口);
- 编译后生成 MyAnnotation.class,JVM 会识别其为 java.lang.annotation.Annotation 的子类型。
添加注解元素(即“参数”)
注解可以包含带默认值或不带默认值的元素,语法类似接口中的方法:
- 每个元素声明为无参方法,返回类型只能是:基本类型、
String、Class、枚举、其他注解,或以上类型的**一维数组**; - 不能有 throws 子句,不能有方法体;
- 若提供
default值,则该元素是可选的;否则使用时必须显式赋值。
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
@interface RequestMapping {
String value() default "";
String method() default "GET";
int timeout() default 3000;
Class>[] exceptions() default {};
}
使用时可写成:@RequestMapping(value = "/user", method = "POST", timeout = 5000)
或利用“value 是默认元素”的特性简写:@RequestMapping("/user")(等价于 @RequestMapping(value = "/user"))
设置注解的作用范围和生命周期(元注解)
自定义注解需配合元注解(meta-annotation)来指定它能标注在哪、保留到什么时候。常用元注解有:
-
@Target:指定可标注的位置,如ElementType.METHOD、ElementType.TYPE、ElementType.FIELD等;支持多个,用数组写法:@Target({METHOD, TYPE}); -
@Retention:指定注解保留策略,常用RetentionPolicy.SOURCE(仅源码)、CLASS(编译进 class,但不加载进 JVM)、RUNTIME(运行时可通过反射获取); -
@Documented:标记该注解应被 Javadoc 工具记录; -
@Inherited:允许子类继承父类上的该注解(仅对类级别注解有效,且仅适用于extends,不适用于实现接口)。
完整示例:
import java.lang.annotation.*;
<p>@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogExecutionTime {
String value() default "default";
}</p>
注意事项与常见误区
定义注解时需留意以下几点:
- 不能继承其他注解或接口(
extends不合法),但可组合多个元注解; - 元素不能是泛型、不能是 null,默认值也不能是 null(可用空字符串、
void.class或自定义占位枚举代替); - 数组默认值写法是
default {}(空数组),不是default null或default []; - 如果注解只含一个名为
value()的元素,且调用时只传一个值,可省略名称直接写值,这是 Java 的语法糖。
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










