一句话总结:
注解就是代码的“便利贴”,贴哪儿就告诉编译器/工具:“这儿要特殊处理!”
一、**注解是啥?举个栗子 **
-
像便利贴:给类、方法、字段贴个标签,用来标记特殊含义。
-
常见内置注解:
@Override // 贴在方法上:老子是重写父类的方法,别搞错了! @Deprecated // 贴在方法上:这方法过时了,别用了!(调用时会有删除线警告) @SuppressWarnings("unchecked") // 贴在代码上:闭嘴!别报黄线警告了!
二、注解能干啥?四大用途
- 编译检查:比如
@Override提醒你正确重写方法。 - 生成文档:用
@Deprecated生成的文档会标“已废弃”。 - 框架配置:比如 Spring 的
@Autowired(自动注入依赖)、JUnit 的@Test(标记测试方法)。 - 运行时处理:通过反射读取注解,动态执行逻辑(比如权限校验)。
三、自定义注解:自己写个标签
步骤:
-
定义注解(像写接口,前面加个
@):// 元注解:控制注解能贴哪儿、有效期多久 @Target(ElementType.METHOD) // 只能贴在方法上 @Retention(RetentionPolicy.RUNTIME) // 注解在运行时有效(能被反射读取) public @interface MyAnnotation { String value() default "默认值"; // 注解的属性(类似方法) int priority() default 1; } -
使用注解:
public class MyClass { @MyAnnotation(value = "紧急任务", priority = 3) public void doSomething() { // ... } }
四、注解原理:背后怎么工作?
-
编译时处理:用注解处理器(APT)在编译时扫描注解,生成代码(比如 Lombok 的
@Data自动生成 getter/setter)。 -
运行时处理:通过反射读取注解,动态执行逻辑(比如 Spring 根据
@Controller创建 Bean)。Method method = obj.getClass().getMethod("doSomething"); if (method.isAnnotationPresent(MyAnnotation.class)) { MyAnnotation anno = method.getAnnotation(MyAnnotation.class); System.out.println("优先级:" + anno.priority()); // 输出 3 }
五、注解 vs 注释:区别在哪?
| 注解(Annotation) | 注释(Comment) | |
|---|---|---|
| 作用对象 | 代码(类、方法、字段) | 给人看的文字 |
| 处理方式 | 编译器/工具/框架会读取并处理 | 编译后直接丢弃 |
| 语法 | 以 @ 开头(如 @Override) | 以 // 或 /* */ 包裹 |
六、实际应用场景
-
JUnit 测试:用
@Test标记测试方法,框架自动执行。 -
Spring 框架:
@Controller // 标记为控制器 @RequestMapping("/user") // 映射URL路径 public class UserController { @Autowired // 自动注入Service private UserService userService; } -
Lombok:用
@Data自动生成 getter/setter,代码更简洁。
总结口诀:
“注解像标签,贴在代码上。
编译能检查,运行时能读。
框架用它配,代码变清爽!”