java注解本质是继承annotation的接口,非注释;需配@target和@retention元注解限定作用位置与生命周期;属性定义受限且value为特殊关键字;运行时须通过反射读取才能生效。

抓Java注解的核心要点,关键不是死记语法,而是理清“谁打标、标在哪、标怎么存、标怎么用”这四条主线。下面分四个实用角度讲清楚。
注解本质是接口,不是注释
很多人一看到 @ 符号就以为是高级注释,这是最大误区。@Override、@MyLog 这些注解在字节码层面,都是继承 java.lang.annotation.Annotation 的接口。编译器会为每个 @interface 自动生成对应接口,运行时靠反射+动态代理还原成具体实例。所以注解本身不执行任何逻辑——它只是个数据容器,真正干活的是读取它的处理器(比如Spring容器、自定义AOP切面、Lombok插件)。
元注解决定注解的“权限”和“寿命”
自定义注解必须配好两个核心元注解:
-
@Target:规定这个注解能贴在哪。比如只允许贴在方法上(METHOD),就不能误用在类或字段上;想同时支持方法和参数,就写
@Target({METHOD, PARAMETER}) - @Retention:决定注解活到什么时候。开发中绝大多数业务注解要选 RUNTIME,否则反射读不到;如果只是给编译器看(如自定义警告),用 SOURCE 就够了。
漏写或写错这两个,注解要么用不了,要么读不到,是新手最常踩的坑。
属性定义有约束,value 是特殊关键字
注解的属性声明像接口方法,但限制多:
- 返回类型只能是基本类型、String、Class、枚举、其他注解,或以上类型的数组
- 必须带 default 值,或使用时显式赋值;没 default 的属性,使用时必须传
- 如果只有一个属性且叫 value(),使用时可省略 key,直接写
@MyLog("msg");否则必须写全@MyLog(level="INFO", msg="xxx")
运行时读取靠反射,不是自动生效
写了注解 ≠ 功能就来了。框架能力(如 @Autowired 注入、@Transactional 开事务)背后全是反射调用:
- 用
method.getAnnotation(MyLog.class)拿到注解实例 - 再调
annotation.value()或annotation.level()取属性值 - 最后根据这些值做日志、校验、拦截等实际动作
自己写工具类或 AOP 切面时,这三步缺一不可。没有反射读取,注解就是一张废纸。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











