当前位置: 首页 > news >正文

JAVA中的注解是什么玩意

vv

Java 注解(Annotation)是 JDK 5.0 引入的一种​​元数据​​机制,它为代码提供了一种形式化的方式,用来为类、方法、变量、参数等程序元素附加额外的信息和说明。这些信息可以被编译器、开发工具或其他运行中的程序读取,从而执行相应的操作,但它不会直接改变代码本身的逻辑 。

为了让你快速建立直观印象,可以先理解注解和注释的核心区别:

对比维度

注解 (Annotation)

注释 (Comment)

​作用对象​

类、方法、字段等程序元素

源代码

​使用者​

编译器、开发工具、JVM或其他程序

程序员

​功能​

提供元数据,可用于编译检查、框架配置、代码生成等

对代码进行解释说明,提高可读性

​保留期​

可保留至源码期、编译期或运行期

编译后即被丢弃

💡 注解的核心作用

注解主要在三个层面发挥作用 :

  1. ​编译检查​​:最典型的例子是 @Override注解。当你用它标记一个方法时,编译器会严格检查该方法是否真正重写了父类的方法。如果不是,编译器就会报错,这有助于避免低级的拼写错误 。

  2. ​生成文档/代码​​:早期可以通过注解生成 API 文档(Javadoc)。现代框架(如 Lombok)则利用注解在编译时自动生成 getter、setter 等方法,减少模板代码 。

  3. ​运行时处理​​:这是框架中最为强大的应用。通过配置 @Retention(RetentionPolicy.RUNTIME),注解信息可以在程序运行时被保留,并通过​​反射机制​​被读取。这使得框架能够实现依赖注入(如 Spring 的 @Autowired)、对象关系映射(如 Hibernate 的 @Entity)、事务管理、AOP 等高级功能 。

🔧 内置注解与元注解

Java 提供了一些内置的注解,也提供了用于定义注解的“元注解”。

  • ​常见内置注解​​:

    • @Override​:标记方法重写。

    • @Deprecated​:标记元素已过时,使用时编译器会产生警告。

    • @SuppressWarnings​:抑制编译器警告(如 @SuppressWarnings("unchecked"))。

    • @FunctionalInterface​(Java 8+):标记接口为函数式接口 。

  • ​核心元注解​​(用于定义注解的注解 ):

    • @Target​:指定注解可以应用在哪些程序元素上(如类、方法、字段等)。通过 ElementType枚举指定 。

    • @Retention​:指定注解的保留策略,即注解的生命周期。这是最关键的一个元注解,通过 RetentionPolicy枚举指定:

      • ​SOURCE​​:仅存在于源码中,编译后丢弃(如 @Override)。

      • ​CLASS​​:存在于源码和 class 文件中,但不会被 JVM 加载到运行时(默认策略)。

      • ​RUNTIME​​:存在于源码、class 文件,并被 JVM 加载到运行时,​​可通过反射读取​​(框架中最常用)。

    • @Documented​:标记该注解会被包含在 Javadoc 生成的文档中 。

    • @Inherited​:标记该注解可以被继承,即如果一个类被该注解标记,其子类将自动拥有该注解 。

🛠️ 如何定义和使用自定义注解

你可以创建自己的注解来满足特定需求。

  1. ​定义注解​​:使用 @interface关键字。注解的本质是一个接口,它默认继承了 java.lang.annotation.Annotation接口 。注解内部可以定义“属性”,这些属性看起来像抽象方法,但有特定的返回值类型要求(基本类型、String、枚举、注解、及以上类型的数组)。

    // 示例:定义一个用于记录日志的注解
    @Target(ElementType.METHOD) // 只能用在方法上
    @Retention(RetentionPolicy.RUNTIME) // 运行时保留,以便通过反射读取
    public @interface Log {String value() default ""; // 定义一个属性,可指定默认值boolean recordParams() default true;
    }
  2. ​使用注解​​:在目标程序元素上使用 @注解名即可。

    public class UserService {@Log(value = "用户登录", recordParams = true)public boolean login(String username, String password) {// ... 业务逻辑}
    }
  3. ​处理注解(通过反射)​​:定义注解本身不产生任何效果,关键在于​​编写解析注解的代码​​。通常通过反射 API 来获取注解信息并执行相应逻辑 。

    // 简单的注解处理器示例
    public class LogProcessor {public static void process(Object obj) throws Exception {Class<?> clazz = obj.getClass();for (Method method : clazz.getDeclaredMethods()) {if (method.isAnnotationPresent(Log.class)) { // 判断方法是否有Log注解Log logAnno = method.getAnnotation(Log.class); // 获取注解实例System.out.println("即将执行方法: " + method.getName());System.out.println("操作描述: " + logAnno.value());// ... 可以在这里记录日志、验证权限等// 然后继续执行原方法// method.invoke(obj, args);}}}
    }

💎 总结与实际应用

总而言之,Java 注解是一种强大的​​元编程​​工具。它的核心价值在于​​将配置信息与代码本身紧密而又清晰地结合在一起​​,从而实现了声明式编程的风格。

在现代 Java 开发中,注解是许多主流框架(如 Spring、Hibernate、JUnit 等)的基石。理解注解的工作原理,特别是​​运行时注解与反射的结合​​,是深入掌握这些框架的关键 。

希望这个解释能帮助你理解 Java 注解。如果你对如何在特定框架(如 Spring)中使用注解,或者想了解更多自定义注解的细节,我们可以继续探讨。

http://www.dtcms.com/a/541833.html

相关文章:

  • 能不能上传网站再备案陕西西安网站设计公司
  • 各大网站注册记录商城建站报价方案
  • 注入漏洞网站源码程序开发的基本步骤是什么?
  • 超硬核c语言编程随想笔记:深挖cint**二级指针-核心多级指针的内存陷阱,彻底终结多级指针恐惧症
  • 邯郸建立网站费用乐清网站开发
  • JAVA面试入职笔记 | linux常用基本指令快速查看
  • 网站设计公司苏州erp系统的功能包括哪些
  • 【2025-系统规划与管理师】第16章:资源与工具管理
  • 天津网站建设案例wordpress怎么导入自己的php
  • 东莞网站优化方法有哪些哈尔滨大型网站设计公司
  • 模板的网站都有哪些公司网站建设公
  • 避免踩坑!三星打印机SCX3401驱动安装详细步骤解析
  • 有哪些网站开发技术甘肃省建设工程造价信息网站
  • 建网站 选安全网页设计代码单元格内容怎么居中
  • 双牌网站建设app网站样式
  • 模型参数大小计算
  • AI智能体连载(9)绘制智能体的工作流
  • 0.4、向量、向量维度、向量比较、向量搜索和相关算法
  • 无SDK API,可自定义API C++开发的脚本语言源码编译过程
  • 广州网站搭建哪家好公司网站报价
  • 网站 单页做网站需要用到什么
  • 硬件与软件交互全解析:协议、控制与数据采集实践
  • 国内外网站建设2017php网站怎么做的
  • 离石古楼角网站建设合肥有哪些做网站的公司
  • 二叉树的锯齿形层序遍历
  • Java8:新日期时间
  • Java_String对象特性
  • 网站做app的软件有哪些360安全浏览器
  • 网站建设 互成网络amp 网站开发
  • 网站app免费生成软件下载免费 片