Java 注解(Annotation)本质上是一种元数据(metadata)机制,用来给代码(类、方法、字段等)“打标签”。它本身不改变程序逻辑,真正起作用的是在合适时机读取并处理这些注解的工具。
下面从「是什么 → 怎么定义 → 怎么生效 → 典型工作流程」逐步说明。
注解是一种“特殊接口”,编译后变成 java.lang.annotation.Annotation 的子类型。
示例:
@Override
void foo() {}
@Override 只是告诉编译器:这是一个重写方法,如果签名不对就报错。
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
String value() default "";
}
关键点有两个:
决定注解能用在哪里:
TYPE(类/接口)METHODFIELDPARAMETER决定注解“活到哪一步”:
| 策略 | 生命周期 |
|---|---|
SOURCE |
只存在于源码,编译后消失(如 @Override) |
CLASS |
在 .class 文件中,但运行时不可见 |
RUNTIME |
运行时可通过反射读取(最常用) |
这是最重要的一点:
注解只是标记,真正起作用的是“处理器”
处理器有三种常见形式:
例子:
@Override@SuppressWarnings流程:
源码 → 编译器读取注解 → 做校验或优化
你感知不到,由 javac 内部处理。
使用 AbstractProcessor:
源码 → 注解处理器 → 生成新代码 / 校验
典型应用:
示例(简化):
@SupportedAnnotationTypes("com.x.Log")
public class LogProcessor extends AbstractProcessor {
public boolean process(...) {
// 读取注解,生成代码
}
}
特点:
.java 文件这是最常用、也最好理解的方式。
@Log("user")
public void save() {}
Method m = obj.getClass().getMethod("save");
if (m.isAnnotationPresent(Log.class)) {
Log log = m.getAnnotation(Log.class);
System.out.println(log.value());
}
典型应用:
@Controller, @Autowired)@Test)以 @Autowired 为例:
@Autowiredfield.setAccessible(true);
field.set(bean, dependency);
✅ 注解本身什么都不做
✅ Spring 是“读注解的人”
Java 注解 = 标签 + 读取标签的引擎
如果你愿意,我可以:
你想看哪一个?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。