合格的自定义注解必须满足四点:①@retention为runtime;②@target覆盖所有实际使用位置;③属性类型限于基本类型、string、class、枚举、注解及一维数组;④附带可验证的使用示例与测试。

注解本身不执行任何逻辑,它只是元数据。代码评审中判断一个自定义注解是否合格,关键不是看它“写得漂不漂亮”,而是看它能否被后续流程稳定识别和使用——编译器、IDE、构建工具或运行时框架是否能按预期读到它。
看 @Retention 是否为 RUNTIME
除非明确只用于编译期(比如 Lombok 或自定义代码生成器),否则业务类注解必须声明 @Retention(RetentionPolicy.RUNTIME)。
- 写成
@Retention(RetentionPolicy.CLASS)或默认SOURCE:字节码里没有该注解,clazz.getAnnotations()返回空数组,Spring AOP、校验器、日志切面等统统失效 - 评审时直接驳回:没 RUNTIME 的注解,在 Spring Boot 场景下等于没写
- 例外仅限配套了 Annotation Processor 且 CI 中已验证生成逻辑的编译期注解
看 @Target 是否覆盖所有真实使用位置
声明了 @Target 就必须穷举实际会加注解的地方;漏掉一个,编译就报错,CI 流水线失败。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 常见组合如
@Target({FIELD, METHOD, PARAMETER}),适用于字段校验 + 方法参数校验 - 别误用
TYPE_PARAMETER:它是给泛型形参(如class Box<t></t>中的T)用的,不是给Box<string></string>这种实参用的 - 不确定未来扩展时,宁可宽泛些(比如加上
TYPE),也别漏掉当前已用位置
看属性类型是否合规
注解属性不能是任意对象,只能是 JVM 原生支持的“常量友好型”类型。
- 允许:基本类型、
String、Class、枚举、其他注解、一维数组(如String[]) - 禁止:
List、Map、自定义 POJO、Object、多维数组(如String[][]) - 替代方案:用字符串传 JSON(需自行解析)、或拆成多个基础属性(如
String key()+String value())
看是否有可验证的使用示例
评审不只看注解定义,更要看它“能不能用”。合格的自研注解必须附带最小可行验证路径。
- 提供一个简单类/方法,加上该注解,并在单元测试中通过反射获取它:
field.getAnnotation(YourAnn.class) - 若用于校验,需给出校验器实现片段,证明能正确提取属性值并执行逻辑
- 若依赖 Spring,要说明触发时机(例如:是否集成进
@Valid链路,是否注册了ConstraintValidator)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










