标记注解是无方法体、不带属性的自定义注解,仅靠存在传递语义,如@Override、@Deprecated;元数据注解则含属性,如@SuppressWarnings、@RequestMapping。

这种没有方法体、不带任何属性的自定义注解,叫做标记注解(Marker Annotation)。
标记注解的特点
它仅靠自身的存在来传递语义,不携带任何配置信息。编译器或运行时工具通过“是否被标注”这一事实来触发特定行为。
- @Override 就是最典型的标记注解:它内部没有声明任何成员方法,只用来表明“这个方法意在重写父类方法”
- 其他常见例子包括 @Deprecated(标识已弃用)、@Documented(标识应包含在 JavaDoc 中)
- 定义时只需
@interface Name { },无需任何方法声明
和元数据注解的区别
与之相对的是元数据注解(Metadata Annotation),即带有属性的注解,比如:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
@SuppressWarnings("unchecked")—— value 属性指定了要抑制的警告类型 -
@RequestMapping("/user")—— path 属性指定了请求路径 - 这类注解必须声明至少一个方法(属性),且返回值类型受限(基本类型、String、Class、枚举、注解、或其一维数组)
标记注解不是“没用”,而是“隐含约定”
它的价值不在于参数,而在于被工具识别的约定:
立即学习“Java免费学习笔记(深入)”;
- 编译器看到 @Override,会检查该方法是否真能重写父类/接口方法,否则报错
- Javadoc 工具看到 @Documented,就知道要把这个注解本身也写进文档
- 你自定义一个 @Loggable,哪怕没属性,只要在方法上加了它,AOP 切面就能据此织入日志逻辑

















