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

Java中的注解(Annotation)

        Java中的注解(Annotation)是一种用于在代码中添加元数据的机制。它们可以被用来为类、方法、变量、参数等元素添加额外的信息,这些信息在编译时或运行时可以被读取和使用。注解本身不会直接影响代码的执行,但可以通过反射等机制在运行时对代码进行处理。

注解的作用

  1. 编译检查:通过注解,编译器可以进行一些特定的检查,例如@Override注解可以确保方法是重写父类的方法。
  2. 代码生成:一些框架(如Spring)使用注解来生成额外的代码或配置文件。
  3. 运行时处理:通过反射机制,可以在运行时读取注解信息,从而进行一些动态处理。

常见的内置注解

  1. @Override:用于标识一个方法是重写父类的方法。
  2. @Deprecated:用于标识一个方法、类或字段已经过时,不建议使用。
  3. @SuppressWarnings:用于抑制编译器警告。

示例代码

1. @Override
public class Parent {public void doSomething() {System.out.println("Parent doing something");}
}public class Child extends Parent {@Override // 标识这个方法是重写父类的方法public void doSomething() {System.out.println("Child doing something");}
}
2. @Deprecated
public class MyClass {@Deprecated // 标识这个方法已经过时public void oldMethod() {System.out.println("This method is deprecated");}public void newMethod() {System.out.println("Use this method instead");}
}
3. @SuppressWarnings
public class SuppressWarningsExample {@SuppressWarnings("unchecked") // 抑制未检查的转换警告public void someMethod() {List list = new ArrayList();list.add("Hello"); // 这里会有未检查的转换警告}
}

自定义注解

        除了内置注解,Java还允许开发者自定义注解。自定义注解是通过@interface关键字来定义的。注解可以包含元素(类似于方法),这些元素可以有默认值。此外,自定义注解还可以使用元注解(如@Retention@Target)来指定注解的生命周期和作用目标。

示例:定义一个简单的自定义注解

示例:自定义注解

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;@Retention(RetentionPolicy.RUNTIME) // 指定注解在运行时可用
@Target(ElementType.METHOD) // 指定注解只能用于方法
public @interface MyAnnotation {String value(); // 注解的元素,可以有默认值int count() default 1; // 带有默认值的元素
}

使用自定义注解

定义好注解后,可以在代码中使用它。使用注解时,需要为注解的元素提供值。

示例:在方法上使用自定义注解
public class UseMyAnnotation {@MyAnnotation(value = "This is a custom annotation", count = 5)public void annotatedMethod() {System.out.println("Method with custom annotation");}
}

处理自定义注解

        通过反射机制,可以在运行时读取和处理注解信息。反射允许我们在运行时检查类、方法、字段等元素上的注解。

import java.lang.reflect.Method;public class AnnotationProcessor {public static void main(String[] args) throws NoSuchMethodException {Method method = UseMyAnnotation.class.getMethod("annotatedMethod");if (method.isAnnotationPresent(MyAnnotation.class)) {MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);System.out.println("Annotation value: " + annotation.value());System.out.println("Annotation count: " + annotation.count());}}
}

详细步骤解析

  1. 定义注解

    • 使用@interface关键字定义注解。
    • 使用@Retention指定注解的生命周期(SOURCE、CLASS、RUNTIME)。
    • 使用@Target指定注解的作用目标(TYPE、METHOD、FIELD等)。
    • 定义注解的元素,可以有默认值。
  2. 使用注解

    • 在类、方法、字段等元素上使用注解。
    • 为注解的元素提供值。
  3. 处理注解

    • 使用反射机制在运行时读取注解信息。
    • 检查元素上是否存在特定注解。
    • 获取注解的元素值并进行相应处理。

通俗易懂的解释

  • 定义注解:就像创建一个特殊的标签(注解),这个标签可以包含一些信息(元素),并且可以告诉编译器和虚拟机这个标签什么时候有效(生命周期),以及可以贴在什么地方(作用目标)。
  • 使用注解:就像在代码上贴上这个特殊的标签,标签上的信息可以帮助编译器或程序员理解代码的意图。
  • 处理注解:就像在运行时检查这些标签,读取标签上的信息,并根据这些信息做出相应的动作。

     我们可以看到注解在Java中的多种用途和用法。注解不仅可以帮助开发者进行编译时检查,还可以在运行时提供额外的信息,从而实现更灵活和动态的代码处理。

注解(Annotation)和注释(Comment)

注解(Annotation)

  1. 定义:注解是一种用于在代码中添加元数据的机制。它们可以被用来为类、方法、变量、参数等元素添加额外的信息。
  2. 用途:注解本身不会直接影响代码的执行,但可以通过反射等机制在编译时或运行时对代码进行处理。注解常用于编译检查、代码生成、运行时处理等。
  3. 语法:注解使用@符号开头,例如@Override@Deprecated
  4. 生命周期:注解可以有不同的生命周期,包括源码级别(SOURCE)、编译时(CLASS)和运行时(RUNTIME)。

注释(Comment)

  1. 定义:注释是用于向代码中添加解释性文本的机制。它们用于帮助开发者理解代码的意图和逻辑。
  2. 用途:注释仅用于代码的可读性,不会被编译器或虚拟机处理。它们在编译时会被忽略。
  3. 语法:注释有多种形式,包括单行注释(//)、多行注释(/* ... */)和文档注释(/** ... */)。
  4. 生命周期:注释仅存在于源码中,编译后不会保留在字节码中。

示例对比

注解示例
@Override // 这是一个注解,用于标识方法重写
public void doSomething() {System.out.println("Child doing something");
}
注释示例
// 这是一个单行注释,用于解释代码的意图
public void doSomething() {/*这是一个多行注释,用于解释方法的详细逻辑*/System.out.println("Child doing something");
}

总结

  • 注解:用于添加元数据,可以通过反射等机制在编译时或运行时处理,不影响代码执行,但可以影响编译器的行为。
  • 注释:用于添加解释性文本,仅用于提高代码可读性,不会被编译器或虚拟机处理。

通过上述对比,我们可以清楚地看到注解和注释在Java中的区别和各自的作用。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MySQL入门学习-MySQL的连接查询
  • switch语句和while循环
  • 算法练习题07:无重复字符的最长子串
  • 临时性解决斐讯K3 路由器端口转发限制
  • GO Date数据处理
  • CSS-定位【看这一篇就够了】
  • 食堂线上预约点餐系统小程序的设计
  • 使用 FormCreate 渲染 Element Plus 表单
  • k8s1.23 部署Prometheus-Operator集群监控
  • 贪心算法---用最少数量的箭引爆气球
  • 【计算机网络】应用层HTTP协议
  • 数据赋能(193)——开发:数据服务——实施过程、应用特点
  • 142.环形链表二-力扣
  • Day 7:条件编译
  • 公务员面试(c语言)
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • angular组件开发
  • Django 博客开发教程 16 - 统计文章阅读量
  • Django 博客开发教程 8 - 博客文章详情页
  • JavaScript 基础知识 - 入门篇(一)
  • javascript面向对象之创建对象
  • Joomla 2.x, 3.x useful code cheatsheet
  • JS变量作用域
  • js如何打印object对象
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 构建工具 - 收藏集 - 掘金
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 聊聊sentinel的DegradeSlot
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 通过npm或yarn自动生成vue组件
  • 怎么将电脑中的声音录制成WAV格式
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​configparser --- 配置文件解析器​
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #AngularJS#$sce.trustAsResourceUrl
  • #前后端分离# 头条发布系统
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (八十八)VFL语言初步 - 实现布局
  • (笔试题)合法字符串
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (转) ns2/nam与nam实现相关的文件
  • (转)nsfocus-绿盟科技笔试题目
  • (转)Oracle存储过程编写经验和优化措施
  • **python多态
  • .Net FrameWork总结
  • .NET HttpWebRequest、WebClient、HttpClient
  • .net refrector
  • .NET 服务 ServiceController
  • .Net 基于MiniExcel的导入功能接口示例
  • .NET 漏洞分析 | 某ERP系统存在SQL注入