【Java-注解】Java 注解详解

什么是注解?

注解是可以放在类、方法、参数上等位置的一种特殊标记:

例如我们常见的 Controller 层代码就常见以下几种特殊标记(Annotation):

@RestController
@RequestMapping("user")
public class UserController {
    
    @GetMapping("getUserById")
    public Result<?> getUserById(@RequestParam("userId") String userId) {
        // ...
        return Result.ok("...");
    }
}

注解的作用?

  • 格式检查:通过 Jdk 内置注解能够让编译器实现基本的编译检查,例如 @Override@Deprecated@SuppressWarnings 等注解
  • 编译时动态处理: 在编译时通过代码中的标识,可以动态生成代码
  • 运行时动态处理: 在运行时通过代码中的标识,可以使用反射获取注解信息

注解的分类?

  • JDK 内置注解

    • @Override: 标记在方法上,用于标识当前方法时重写的父类(父接口)方法,编译器在编译期会检查是否符合重写规则,不符合,编译报错
    • @Deprecated: 可以标记在类、方法、 成员变量,标记该方法过时的方法,编译器在编译期会进行警告
    • @SuppressWarnings: 可以放在类和方法上,可以阻止编译器发出某些警告信息
  • 元注解

    ​ 可以修饰其他注解的注解被称为元注解(meta annotation)

    • @Target: 定义 Annotation 可以被应用于哪些位置:
      • 类或接口:ElementType.TYPE
      • 字段:ElementType.FIELD
      • 方法:ElementType.METHOD
      • 构造方法:ElementType.CONSTRUCTOR
      • 方法参数:ElementType.PARAMETER
    • @Retention: 定义 Annotation 的生命周期:
      • 编译期:RetentionPolicy.SOURCE
      • class 文件:RetentionPolicy.CLASS (默认)
      • 运行期:RetentionPolicy.RUNTIME
    • @Repeatable: 定义 Annotation 是否可重复使用
    • @Inherited: 定义子类是否可继承父类的 Annotation
  • 自定义注解

    可以根据自己的需求来定义注解来实现特定的功能,例以下为实现自动日志的自定义注解:

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface AutoLog {
        /**
    	 * 日志内容
    	 */
        String value() default "";
        
        /**
         * 日志类型
         */
        int logType() default 0;
        
        /**
         * 操作日志类型
         */
        int operateType() default 0;
    }
    

注解的应用案例

案例一:@Override 的原理解析

案例二:编译期通过注解自动生成代码

案例三:通过自定义注解 + AOP 实现数据字典的自动解析


版权声明:本文为qq_37581282原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。