拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Java 注解类型详解:从入门到实战

1. 什么是注解注解Annotation是 Java 5 引入的一种元数据机制它允许我们在代码中添加结构化、机器可读的元数据信息。注解本身不直接影响程序运行逻辑但可以被编译器、框架和工具在编译期或运行期读取并处理。简单来说注解就是给代码贴的「标签」这些标签可以被各种工具识别并触发相应的行为。2. 注解的分类Java 注解按生命周期和作用范围可以分为以下几类2.1 按生命周期分类源码级注解SOURCE仅在源码中存在编译时被丢弃。典型代表是Override、SuppressWarnings。编译期注解CLASS保留到编译后的 class 文件中但运行时不可见。常用于字节码增强工具。运行期注解RUNTIME不仅保留在 class 文件中还能在运行时通过反射读取。这是框架开发中最常用的一类如Autowired、RequestMapping。2.2 按用途分类标记注解不含任何成员变量仅用于标记如Deprecated。单值注解只有一个成员变量通常命名为value使用时可以省略变量名如SuppressWarnings(unchecked)。完整注解包含多个成员变量使用时需显式指定如RequestMapping(value /user, method RequestMethod.GET)。3. 自定义注解3.1 定义注解使用interface关键字定义注解importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;Retention(RetentionPolicy.RUNTIME)Target(ElementType.METHOD)publicinterfaceLogExecutionTime{Stringvalue()default;booleanprintArgs()defaultfalse;}3.2 注解成员变量注解的成员变量以方法的形式声明可以指定默认值publicinterfaceApiInfo{Stringauthor()defaultunknown;Stringversion()default1.0.0;String[]tags()default{};}成员变量支持的类型包括基本类型、String、Class、枚举、注解以及这些类型的数组。4. 元注解元注解是用于修饰其他注解的注解Java 提供了以下四种核心元注解元注解作用Retention指定注解的生命周期SOURCE/CLASS/RUNTIMETarget指定注解可以修饰的目标类、方法、字段等Documented标记该注解应被 javadoc 文档化Inherited标记该注解可被子类继承4.1 Target 的可选值ElementType.TYPE// 类、接口、枚举ElementType.FIELD// 字段ElementType.METHOD// 方法ElementType.PARAMETER// 参数ElementType.CONSTRUCTOR// 构造器ElementType.LOCAL_VARIABLE// 局部变量ElementType.ANNOTATION_TYPE// 注解类型ElementType.PACKAGE// 包ElementType.TYPE_PARAMETER// 类型参数ElementType.TYPE_USE// 类型使用处5. 注解的读取5.1 运行时反射读取importjava.lang.reflect.Method;publicclassAnnotationDemo{LogExecutionTime(valuegetUser,printArgstrue)publicvoidgetUser(Stringid){System.out.println(查询用户id);}publicstaticvoidmain(String[]args)throwsException{MethodmethodAnnotationDemo.class.getMethod(getUser,String.class);if(method.isAnnotationPresent(LogExecutionTime.class)){LogExecutionTimeannotationmethod.getAnnotation(LogExecutionTime.class);System.out.println(注解值annotation.value());System.out.println(是否打印参数annotation.printArgs());}}}5.2 编译期处理APT编译期注解处理器通过javax.annotation.processing包实现常用于生成代码如 Lombok、MapStruct 等框架。6. 注解的典型应用场景6.1 框架开发Spring、MyBatis 等框架大量使用注解简化配置RestControllerRequestMapping(/api/users)publicclassUserController{GetMapping(/{id})publicUsergetUser(PathVariableLongid){returnuserService.findById(id);}}6.2 代码生成通过注解处理器在编译期自动生成样板代码减少手写工作量。6.3 参数校验publicclassUser{NotNull(message用户名不能为空)Size(min2,max20,message用户名长度必须在 2-20 之间)privateStringname;}7. 注解与反射的配合注解本身只是元数据真正发挥作用需要配合反射或注解处理器。运行时注解的典型处理流程如下是否定义注解标注到目标代码程序启动反射扫描注解是否命中目标注解读取注解属性执行对应逻辑跳过处理8. 注意事项注解成员变量不能使用包装类型必须使用基本类型。注解不能继承其他注解但可以通过元注解Inherited实现类级别的继承效果。运行时注解的反射读取有一定性能开销高频调用场景需谨慎使用。注解成员变量名不能使用element等保留关键字。9. 总结Java 注解是一种强大的元数据机制它让代码更加简洁、可读性更强也是现代 Java 框架的基石。掌握注解的定义、元注解的使用以及反射读取方式是深入理解 Spring 等主流框架的必备技能。建议读者动手实践一个自定义注解结合反射实现一个简单的日志切面加深理解。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门