Java学习中,如何理解注解的概念及常用注解的使用方法

一、简介

Java注解(Annotation)是一种元数据,提供了一种将数据与程序元素(类、方法、字段等)关联的方法。注解本身不改变程序的执行逻辑,但可以通过工具或框架进行处理,从而影响编译、运行时的行为。

二、注解的作用

1. 提供信息给编译器:可以使用注解检查错误或抑制警告。

2. 编译时处理:生成代码、XML文件等。

3. 运行时处理:通过反射在运行时进行动态处理。

三、注解的基本概念

1. 内置注解:Java提供了一些常用的标准注解,如@Override@Deprecated@SuppressWarnings

2. 元注解:用于注解其他注解的注解,如@Retention@Target@Inherited@Documented

3. 自定义注解:用户可以根据需求定义自己的注解。

四、常用内置注解

1. @Override

  • 用于标注方法,表明该方法重写了父类的方法。
@Override
public String toString() {
    return "Hello, World!";
}

2. @Deprecated

  • 表示某个元素(类、方法等)已过时,不推荐使用。
@Deprecated
public void oldMethod() {
    // 不推荐使用的方法
}

3. @SuppressWarnings

  • 用于抑制编译器警告。
@SuppressWarnings("unchecked")
public void test() {
    List rawList = new ArrayList();
}
五、元注解

1. @Retention

  • 表示注解的保留策略。
  1. RetentionPolicy.SOURCE:注解只在源代码中保留,编译时被丢弃。
  2. RetentionPolicy.CLASS:注解在字节码中保留,但在运行时不被保留。
  3. RetentionPolicy.RUNTIME:注解在运行时保留,可以通过反射获取。
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}

2. @Target

  • 指定注解可以应用的元素类型,如类、方法、字段等。
@Target(ElementType.METHOD)
public @interface MyAnnotation {
}

3. @Inherited

  • 表示注解可以被子类继承。
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyInheritedAnnotation {
}

4. @Documented

  • 表示使用此注解的元素应包含在Javadoc中。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyDocumentedAnnotation {
}
六、自定义注解

自定义注解可以根据实际需求定义,包含成员变量和默认值。

1. 定义注解
import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyCustomAnnotation {
    String value() default "default value";
    int number() default 0;
}

2. 使用注解

public class MyClass {
    @MyCustomAnnotation(value = "test", number = 42)
    public void myMethod() {
        System.out.println("Hello, World!");
    }
}
3. 处理注解

可以使用反射获取并处理注解。

import java.lang.reflect.Method;

public class AnnotationProcessor {
    public static void main(String[] args) {
        try {
            Method method = MyClass.class.getMethod("myMethod");
            if (method.isAnnotationPresent(MyCustomAnnotation.class)) {
                MyCustomAnnotation annotation = method.getAnnotation(MyCustomAnnotation.class);
                System.out.println("value: " + annotation.value());
                System.out.println("number: " + annotation.number());
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}
七、常见注解框架

1. JUnit

  • 单元测试框架,常用注解有@Test@Before@After等。
@Test
public void testMethod() {
    // 测试代码
}

2. Spring

  • 依赖注入和面向切面编程框架,常用注解有@Component@Autowired@RequestMapping等。
@Component
public class MyService {
}

@Autowired
private MyService myService;

3. Hibernate

  • ORM框架,常用注解有@Entity@Table@Id@GeneratedValue等。
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
}
八、注解处理工具

1. Annotation Processor

  • 编译时注解处理器,允许在编译期间生成代码、检查注解等。
@SupportedAnnotationTypes("com.example.MyAnnotation")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class MyAnnotationProcessor extends AbstractProcessor {
    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        for (Element element : roundEnv.getElementsAnnotatedWith(MyAnnotation.class)) {
            // 处理注解
        }
        return true;
    }
}

2. 反射

  • 运行时处理注解,通过反射API获取注解并进行处理。
public class ReflectionExample {
    public static void main(String[] args) throws Exception {
        Method method = MyClass.class.getMethod("myMethod");
        MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
        if (annotation != null) {
            System.out.println("value: " + annotation.value());
        }
    }
}
九、实际案例

以Spring框架中的注解为例,展示如何通过注解进行依赖注入和控制反转。

1. 定义注解

Spring提供了@Component@Service@Repository等注解,用于标记组件类,@Autowired用于自动注入依赖。

@Component
public class MyComponent {
    public void doSomething() {
        System.out.println("Doing something");
    }
}

@Service
public class MyService {
    @Autowired
    private MyComponent myComponent;

    public void performTask() {
        myComponent.doSomething();
    }
}
2. 配置扫描

Spring配置类或XML文件中启用组件扫描。

@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
}
3. 使用Spring应用上下文

创建Spring应用上下文并获取Bean。

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        MyService myService = context.getBean(MyService.class);
        myService.performTask();
    }
}
十、注解的优缺点
优点
  1. 简化配置:注解可以减少XML配置,提高可读性和可维护性。
  2. 类型安全:注解在编译时进行检查,避免了运行时错误。
  3. 灵活性:通过注解可以方便地扩展和修改功能。
缺点
  1. 过度使用:滥用注解可能导致代码难以理解和维护。
  2. 依赖特定框架:不同框架的注解不通用,导致代码耦合度高。
  3. 反射开销:运行时处理注解需要使用反射,可能影响性能。

Java注解是一种强大的元数据机制,可以用于提供编译器信息、编译时生成代码、运行时动态处理等。通过内置注解、元注解和自定义注解,可以实现灵活的功能扩展。常见的注解框架如JUnit、Spring、Hibernate等广泛使用注解简化配置和编码。理解和合理使用注解,可以提升代码的可读性、可维护性和灵活性,但也需注意避免过度依赖和滥用。

通过实际案例和代码示例,可以更好地掌握注解的使用方法和原理。未来的开发中,注解将继续发挥重要作用,帮助开发者编写高效、优雅的Java代码。

黑马程序员免费预约咨询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/686912.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新品发布 | 飞凌嵌入式RK3576核心板,为AIoT应用赋能

为了充分满足AIoT市场对高性能、高算力和低功耗主控日益增长的需求&#xff0c;飞凌嵌入式全新推出基于Rockchip RK3576处理器开发设计的FET3576-C核心板&#xff01; 集成4个ARM Cortex-A72和4个ARM Cortex-A53高性能核&#xff0c;内置6TOPS超强算力NPU&#xff0c;为您的AI…

ComfyUI 完全入门:必备插件

ComfyUI 是一个基于 Stable Diffusion 的AI绘画创作工具&#xff0c;最近发展势头特别迅猛&#xff0c;但是 ComfyUI 的上手门槛有点高&#xff0c;用户需要对 Stable Diffusion 以及各种数字技术的原理有一定的了解才行。这个系列将会介绍 ComfyUI 的一些基础概念和使用方法&a…

1+x(Java)中级题库易混淆理论题(三)

SQL 语句中进行 group by 分组时&#xff0c;可以不写 where 子句 分组时可以多层分组&#xff0c;比如&#xff1a;先按照省、再按照市来分组。 File 类不能获取文件的内容 在使用 select 语句进行查询分组时&#xff0c;如果希望去掉不满足条件的分组&#xff0c;使用 hav…

ES 8的向量检索性能调优实践

前言 ES的官方实验室曾发布过一篇博客,介绍了使ES向量检索性能获得显著提升的技术要点与展望: 多线程搜索能力的利用:Lucene 的分段架构允许实现多线程搜索能力。Elasticsearch 通过同时搜索多个段来提高性能,使用所有可用的 CPU 核心的计算能力显著减少了单个搜索的延迟。…

Laravel框架进阶:掌握队列系统,优化应用性能

Laravel使用队列处理 本文主要讲述如何利用 Laravel 框架的队列系统来管理异步任务和设置周期性执行的任务&#xff0c;从而增强应用程序的效能和可靠性。 Laravel队列的优势 异步执行&#xff1a;将任务添加到队列中后&#xff0c;可以立即返回响应给用户&#xff0c;而任务…

1000Base-T协议解读

一、说明 千兆以太网家族包括1000Base-SX(短距)、1000Base-LX(长距)、1000Base-CX(铜缆短距)、1000Base-T1(车载以太网)和1000Base-T等多种标准,我们这边主要了解下1000Base-T,也就是工业千兆以太网,PC电脑的网口都是这个。 1000Base-T采用了4D-PAM5编码技术(4D代…

SpringBoot整合RabbitMQ (持续更新中)

RabbitMQ 官网地址&#xff1a;RabbitMQ: One broker to queue them all | RabbitMQ RabbitMQ 与 Erlang 版本兼容关系​ 3.13.0 26.0 26.2.x The 3.13 release series is compatible with Erlang 26. OpenSSL 3 support in Erlang is considered to be mature and ready for…

告别冗长代码:Java Lambda 表达式如何简化你的编程

在现代软件开发中&#xff0c;高效和简洁的代码变得越来越重要。Java作为一门成熟而广泛使用的编程语言&#xff0c;一直在不断进化&#xff0c;以满足开发者的需求。Java 8的推出标志着一次重要的飞跃&#xff0c;其中最引人注目的特性之一便是Lambda表达式。 Lambda表达式为J…

Docker 进入指定容器内部(以Mysql为例)

文章目录 一、启动容器二、查看容器是否启动三、进入容器内部 一、启动容器 这个就不多说了 直接docker run… 二、查看容器是否启动 查看正在运行的容器 docker ps查看所有的容器 docker ps -a结果如下图所示&#xff1a; 三、进入容器内部 通过CONTAINER ID进入到容器…

linux命令别名与shell函数

# 修改网卡配置 alias vinetwork"vi /etc/sysconfig/network-scripts/ifcfg-ens33" 1. 方法和调用在同一个文件 # 定义shell函数,返回值通过$?获取 function say_hello(){ echo "hello shell" return 1 } # 使用shell函数 say_hello # 执行脚本后接收返…

zabbix-agent如何版本回退降低?

文章目录 1&#xff0c;查看zabbix-agent版本号2&#xff0c;查看zabbix-server的版本号3&#xff0c;卸载已有的zabbix-agent4&#xff0c;找到与zabbix-server匹配版本的zabbix-agent5&#xff0c;安装zabbix-agent 5.0.42版本6&#xff0c;查看已安装的zabbix-agent的版本号…

4秒惊艳!Stable Cascade AI绘画神器,设计师和普通用户的无限创意新选择

近日&#xff0c;一款AI绘画模型Stable Cascade发布。 只需输入一段描述文字&#xff0c;即可在4秒钟内获得令人惊艳的图像。 无论你是设计师、艺术家&#xff0c;还是普通用户&#xff0c;都能轻松上手&#xff0c;释放无限创意。 Stable Cascade不仅在使用上极具便捷性&am…

hot100_62不同路径

不同路径 题目思路、代码1.排列组合2.动态规划 题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff0…

如何提升推广链接辨识度与可信度?试试自定义链接后缀

各位大佬&#xff0c;咱今天来聊聊短信营销这个事儿。这可是好多企业都在用的营销手段啊&#xff0c;一条几分钱的短信&#xff0c;就能搭起用户和企业的桥梁&#xff0c;能增强粘性、促成交易或者推动复购&#xff0c;那真是高覆盖、低成本、高效率。 但现在问题来了&#xf…

电商数据采集决策智慧:深度解析数据采集与应用||电商API数据采集接口的接入与应用

引言 在数字化时代&#xff0c;数据已成为电商企业最宝贵的资产之一。通过有效的数据采集&#xff0c;企业能够洞察市场动态、理解消费者需求、优化运营策略&#xff0c;从而在激烈的市场竞争中脱颖而出。本文将深入探讨电商数据采集的重要性、常用方法以及应用实践。 一、电…

Hadoop3:MapReduce工作流程图解

一、流程图 二、流程说明 上面的流程是整个MapReduce最全工作流程&#xff0c;但是Shuffle过程只是从第7步开始到第16步结束&#xff0c;具体Shuffle过程详解&#xff0c;如下&#xff1a; &#xff08;1&#xff09;MapTask收集我们的map()方法输出的kv对&#xff0c;放到内存…

[AI OpenAI] 提取GPT-4中的概念

总结&#xff1a; 研究人员采用新的可扩展方法&#xff0c;将GPT-4的内部表示分解为1600万个通常可解释的模式&#xff0c;这些模式被称为“特征”&#xff0c;目的是提高语言模型的透明度和可解释性。通过使用稀疏自编码器&#xff0c;研究人员能够识别与特定概念相关的特征&…

【面试干货】索引的作用

【面试干货】索引的作用 1、索引的作用 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、索引的作用 索引 可以协助 快速查询、更新数据库表中数据。 通过使用索引&#xff0c;数据库系统能够快速定位到符合查询条件的数据&#xff0c;提…

第二证券炒股知识:北交所的股票是a股吗?是主板吗?

北交所的股票是a股&#xff0c;但不属于主板&#xff0c;是一个单独的板块。 A股主板是在上海证券买卖所或许深圳证券买卖所上市的公司&#xff0c;主板通常是大盘股&#xff0c;多为商场占有率高、规划大、盈余安稳良好的大型企业。沪市主板以600、601或603最初&#xff0c;深…

Game Fi链游:定制开发源码搭建

随着科技的飞速发展&#xff0c;游戏开发行业正经历着前所未有的变革。Game Fi&#xff0c;这个新兴的概念&#xff0c;正以其独特的魅力&#xff0c;引发了游戏开发行业的热潮。 一、Game Fi 的概念与影响 Game Fi&#xff0c;是一种新型的游戏开发模式&#xff0c;它强调游…