一句话说透Java里面的Annotation

180 阅读2分钟

一句话总结:
注解就是代码的“便利贴”,贴哪儿就告诉编译器/工具:“这儿要特殊处理!”


一、**注解是啥?举个栗子 **

  • 像便利贴:给类、方法、字段贴个标签,用来标记特殊含义。

  • 常见内置注解

    @Override     // 贴在方法上:老子是重写父类的方法,别搞错了!  
    @Deprecated   // 贴在方法上:这方法过时了,别用了!(调用时会有删除线警告)  
    @SuppressWarnings("unchecked")  // 贴在代码上:闭嘴!别报黄线警告了!  
    

二、注解能干啥?四大用途

  1. 编译检查:比如 @Override 提醒你正确重写方法。
  2. 生成文档:用 @Deprecated 生成的文档会标“已废弃”。
  3. 框架配置:比如 Spring 的 @Autowired(自动注入依赖)、JUnit 的 @Test(标记测试方法)。
  4. 运行时处理:通过反射读取注解,动态执行逻辑(比如权限校验)。

三、自定义注解:自己写个标签

步骤:

  1. 定义注解(像写接口,前面加个@):

    // 元注解:控制注解能贴哪儿、有效期多久  
    @Target(ElementType.METHOD)  // 只能贴在方法上  
    @Retention(RetentionPolicy.RUNTIME) // 注解在运行时有效(能被反射读取)  
    public @interface MyAnnotation {  
        String value() default "默认值"; // 注解的属性(类似方法)  
        int priority() default 1;  
    }  
    
  2. 使用注解

    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以 // 或 /* */ 包裹

六、实际应用场景

  1. JUnit 测试:用 @Test 标记测试方法,框架自动执行。

  2. Spring 框架

    @Controller          // 标记为控制器  
    @RequestMapping("/user") // 映射URL路径  
    public class UserController {  
        @Autowired      // 自动注入Service  
        private UserService userService;  
    }  
    
  3. Lombok:用 @Data 自动生成 getter/setter,代码更简洁。


总结口诀:

“注解像标签,贴在代码上。
编译能检查,运行时能读。
框架用它配,代码变清爽!”