什么是注解?
注解是可以放在类、方法、参数上等位置的一种特殊标记:
例如我们常见的 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版权协议,转载请附上原文出处链接和本声明。