自定义业务注解必须指定@retention和@target:①@retention(retentionpolicy.runtime)确保运行时可通过反射读取;②@target限制使用位置,如@target(elementtype.method)限定仅方法可用;③示例requirerole注解用于权限校验;④@documented和@inherited按需增强可维护性。

自定义业务注解时,@Retention 和 @Target 是两个必须明确指定的元注解,它们决定了注解的生命周期和可用位置。
① @Retention:控制注解保留到哪个阶段
它指定注解在编译、运行时是否还存在,常用取值有:
-
RetentionPolicy.SOURCE:仅保留在源码中,编译后丢弃(如@Override) -
RetentionPolicy.CLASS:保留在 .class 文件中,但 JVM 不加载(默认值,反射拿不到) -
RetentionPolicy.RUNTIME:保留在 .class 中且 JVM 加载,可通过反射读取(业务注解最常用)
例如,想在运行时用 AOP 或反射处理注解,必须写:
@Retention(RetentionPolicy.RUNTIME)
② @Target:限制注解能标注哪些程序元素
避免误用,提升语义清晰度。常见取值包括:
-
ElementType.METHOD:只能用于方法 -
ElementType.TYPE:只能用于类、接口、枚举 -
ElementType.FIELD:只能用于字段 -
ElementType.PARAMETER:只能用于方法参数 -
ElementType.CONSTRUCTOR:只能用于构造方法 - 支持组合:如
@Target({ElementType.METHOD, ElementType.TYPE})
比如日志注解通常只作用于方法:
@Target(ElementType.METHOD)
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
③ 实际自定义示例:一个权限校验注解
假设需要在 Controller 方法上标记所需角色:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequireRole {
String value() default "USER";
String[] roles() default {};
}
使用时:
@RestController
public class UserController {
@RequireRole(roles = {"ADMIN", "MANAGER"})
public String deleteUser() { ... }
}
后续可用 AOP 或拦截器通过反射获取该注解并做权限判断。
④ 小贴士:别漏掉 @Documented 和 @Inherited(按需添加)
虽然不是必须,但增强可维护性:
- @Documented:让注解出现在 Javadoc 中
- @Inherited:子类自动继承父类上的该注解(仅对类有效)
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










