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

news2024/11/24 14:48:44
一、简介

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代码。

黑马程序员免费预约咨询

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Suryxin’s ACM退役记

序 我的记忆力很差&#xff0c;经历过的很多事情都已经记不太清了&#xff0c;其中有很多美好回忆也已经消散&#xff0c;我很惋惜没能留存一些照片和声音或是文字供我怀念&#xff0c;这就像《泰坦尼克号》一样&#xff0c;露丝和杰克感人肺腑的爱情故事&#xff0c;最后也仅…

东航携手抖音生活服务开启机票首播,推出国内、国际超值机票次卡

在民航暑运旺季到来之际&#xff0c;越来越多的用户选择提前做好旅行规划&#xff0c;囤下高性价比的出游商品。6月6日18点&#xff0c;中国东方航空&#xff08;以下简称“东航”&#xff09;将在抖音开启首次机票直播&#xff0c;推荐多款超值机票次卡及空中Wi-Fi等特色产品&…

SpringBoot发邮件服务如何配置?怎么使用?

SpringBoot发邮件需要的参数&#xff1f;邮件发送性能如何优化&#xff1f; 在SpringBoot项目中配置发邮件服务是一个常见的需求&#xff0c;它允许我们通过应用程序发送通知、验证邮件或其他类型的邮件。AokSend将详细介绍如何在SpringBoot中配置发邮件服务。 SpringBoot发邮…

nginx和proxy_protocol协议

目录 1. 引言2. HTTP server的配置3. Stream server的配置3.1 作为proxy_protocol的前端服务器3.2 作为proxy_protocol的后端服务器1. 引言 proxy_protocol 是haproxy开发的一种用于在代理服务器和后端服务器之间传递客户端连接信息的协议。使用 proxy_protocol 的主要优势是能…

QT获取最小化,最大化,关闭窗口事件

QT获取最小化&#xff0c;最大化&#xff0c;关闭窗口事件 主程序头文件&#xff1a; 实现&#xff1a; changeEvent&#xff0c;状态改变事件 closeEvent触发点击窗口关闭按钮事件 其代码它参考&#xff1a; /*重写该函数*/ void MainWindow::changeEvent(QEvent *event) {…

蚓链数字化营销生态的影响力分享!

​家人们&#xff0c;今天来给大家分享一些关于数字化平台生态化对数字营销影响的具体案例。 比如某电商平台&#xff0c;通过生态化的建设&#xff0c;实现了精准的推荐算法。根据用户的浏览历史和购买行为&#xff0c;为他们推荐最符合需求的商品&#xff0c;大大提高了购买…

JeeSite 快速开发平台 Vue3 前端版介绍

JeeSite 快速开发平台 Vue3 前端版介绍&#xff1a; 它构建于 Vue3、Vite、Ant-Design-Vue、TypeScript 以及 Vue Vben Admin 等最前沿的技术栈之上&#xff0c;能助力初学者迅速上手并顺利融入团队开发进程。涵盖的模块包括组织机构、角色用户、菜单授权、数据权限、系统参数…

小程序开发平台——超级万能DIY商城小程序源码系统 前后端分离 带完整的安装代码包以及搭建教程

系统概述 超级万能 DIY 商城小程序源码系统是一款集前端和后端分离的强大工具&#xff0c;为开发者提供了一站式的解决方案。它不仅具备完整的安装代码包&#xff0c;还附带详细的搭建教程&#xff0c;让即使是没有丰富技术经验的开发者也能轻松上手&#xff0c;快速构建自己的…

Vue3实战笔记(56)—实战:DefineModel的使用方法细节

文章目录 前言一、实战DefineModel二、思考原理总结 前言 今天写个小例子&#xff0c;实战DefineModel的使用方法细节 一、实战DefineModel 上文官方说的挺清楚&#xff0c;实战验证一下&#xff0c;新建DefineModel.vue&#xff08;这是儿子&#xff09;&#xff1a; <te…

珠海鸿瑞毛利率持续下滑:核心产品销量大降,偿债能力偏弱

《港湾商业观察》黄懿 日前&#xff0c;珠海市鸿瑞信息技术股份有限公司&#xff08;下称“珠海鸿瑞”&#xff09;收到了北京证券交易所发出的第三轮审核问询函。 此前&#xff0c;2020年11月&#xff0c;珠海鸿瑞曾向深交所报送上市申请。IPO申请文件获受理后&#xff0c;珠…

MySQL8 全文索引

文章目录 创建索引使用索引总结 创建索引 之前未尝试过使用MySQL8的全文索引&#xff0c;今天试一试看看什么效果&#xff0c;否则跟不上时代了都。   创建索引非常简单&#xff0c;写句SQL就行。 create table goods(id integer primary key auto_increment,name varchar(2…

知识图谱的应用---智能制造

文章目录 智能制造典型应用 智能制造 随着云计算、大数据、人工智能技术的快速发展&#xff0c;越来越多的新技术正在应用于传统工业领域&#xff0c;并在帮助企业实现产业转型、技术升级及效益提升方面起到了关键作用。目前在提升良品率方面&#xff0c;知识图谱通过深度计算所…

Selenium时间等待_显示等待

特点&#xff1a; 针对具体元素进行时间等待 可以自定义等待时长和间隔时间 按照设定的时间&#xff0c;不断定位元素&#xff0c;定位到了直接执行下一步操作 如在设定时间内没定位到元素&#xff0c;则报错&#xff08;TimeOutException&#xff09; 显示等待概念&#x…

【Python报错】已解决NameError: name ‘secrets‘ is not defined

解决Python报错&#xff1a;NameError: name ‘secrets’ is not defined 在使用Python进行安全编程时&#xff0c;我们经常需要使用secrets模块来生成安全的随机数。然而&#xff0c;如果你在尝试使用这个模块时遇到了NameError: name secrets is not defined的错误&#xff0…

【机器学习】机器学习与智能交通在智慧城市中的融合应用与性能优化新探索

文章目录 引言机器学习与智能交通的基本概念机器学习概述监督学习无监督学习强化学习 智能交通概述交通流量预测交通拥堵管理智能信号控制智能停车管理 机器学习与智能交通的融合应用实时交通数据分析数据预处理特征工程 交通流量预测与优化模型训练模型评估 智能信号控制与优化…

安装TPMmanager

sudo apt-get install qt4-qmake sudo apt-get install libqt4-dev下载TPMManager&#xff0c;解压之后拖入Ubuntu&#xff0c;进入目录 https://gitcode.com/Rohde-Schwarz/TPMManager/overview?utm_sourcecsdn_github_accelerator&isLogin1 cd tpmmanager-master qmake…

【Spring Cloud】Gateway 服务网关核心架构的执行流程和断言

文章目录 基本概念执行流程断言内置路由断言工厂自定义路由断言工厂 总结 基本概念 路由(Route)是gateway中最基本的组件之一&#xff0c;表示一个具体的路由信息载体。主要定义了下面的几个信息&#xff1a; id&#xff1a;路由标识符&#xff0c;区别于其他Route。uri&…

centos系统清理docker日志文件

centos系统清理docker日志文件 1.查看docker根目录位置2.清理日志 1.查看docker根目录位置 命令&#xff1a;docker info ,将Docker Root Dir 的值复制下来。如果目录中包含 等特殊符号的目录&#xff0c;需要转义 2.清理日志 创建文件&#xff1a;vim docker_logs_clean.…

对GNSS辐射测试有疑问?德思特为您解答!

一、问题背景 在我们真实的环境中&#xff0c;GNSS信号是无处不在的&#xff0c;他通过从卫星辐射的形式覆盖地表。当我们想要使用GNSS模拟器进行测试时&#xff0c;一般有两种方式&#xff1a; ● 通过线缆直接连接待测件&#xff0c;无需额外环境与配置&#xff0c;即可进行…

问题:以下描写乡村词语的是() #媒体#媒体#知识分享

问题&#xff1a;以下描写乡村词语的是&#xff08;&#xff09; A&#xff0e;高楼林立 B&#xff0e;车水马龙 C&#xff0e;依山傍水 参考答案如图所示