lombok常用注解使用与原理

news2025/5/9 12:47:37

什么是lombok

  • 一个优秀的Java代码库,简化了Java的编码,为Java代码的精简提供了一种方式

使用方法:pom文件中引入依赖

<!--scope:provided,只在编译阶段生效,不需要打入包中-->
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.16</version>
  <scope>provided</scope>
</dependency>

@Getter/@Setter

  • 作用类上,生成所有成员变量的set/get方法

  • 作用于成员变量上,生成该成员变量的set/get方法

  • 方法控制访问级别@Getter/@Setter注解加上AccessLevel:PUBLIC, MODULE, PROTECTED, PACKAGE, PRIVATE,NONE(不生成);示例:@Getter(AccessLevel.PRIVATE)

  • final修饰只会生成get方法

  • static修饰不会生成set/get方法

@NonNull

  • 作用于方法上或者属性,用于非空判断,如果为空则抛异常

  • 代码

    public void test(@NonNull String name) {
        System.out.println(name);
    }
    
  • 字节码

    public void test(@NonNull String name) {
        if (name == null) {
            throw new NullPointerException("name is marked non-null but is null");
        } else {
            System.out.println(name);
        }
    }
    

构造器注解

  • @NoArgsConstructor无参构造器

  • @AllArgsConstructor全参构造器

  • @RequiredArgsConstructor

    • 指定参数的构造函数,有以下特征的字段:final类型未被初始化的属性,标记了@NonNull的属性

@ToString

  • 作用于类,覆盖默认的toString()方法
  • 不包括某个字段@ToString(exclude = {"createTime"})
  • 只输出某个字段@ToString(of = {"createTime"})

@EqualsAndHashCode

  • 作用于类,覆盖默认的equals和hashCode方法,作用于全部字段
  • 不包括某个字段@EqualsAndHashCode(exclude = {"createTime"})
  • 只输出某个字段@EqualsAndHashCode(of = {"createTime"})

@Data

  • 作用于类上,是以下注解的集合
    • Getter
    • Setter
    • RequiredArgsConstructor
    • ToString
    • EqualsAndHashCode

@Builder

  • 构造者模式:又称之为建造者模式
    • 场景:当一个bean类重载了多个构造方法时,并且参数随机使用时,考虑使用构造者模式
    • 谷歌的开源protobuf协议生产的java bean赋值就是采用建造者模式
  • @Builder作用于类上
  • 使用:User user = User.builder().id(1).build();

@Log/@Sl4j

  • 作用于类上,生成日志变量,用于记录日志

  • 使用:log.info("info日志");

使用注意点

如果只使用了@Data,而不使用@EqualsAndHashCode(callSuper = true)的话,会默认@EqualsAndHashCode(callSuper = false),这时候生成的equals()方法只会比较子类的属性,不会考虑从父类继承的属性,无论父类属性访问权限是否开放

lombok实现原理

  • 熟悉Java自定义注解的同学已经猜到是JSR269插件化注解处理

  • JSR269:Pluggable Annotation Processing API实现在Javac编译阶段利用“Annotation Processor“对自定义的注解进行预处理后生成真正在JVM上面执行的Class文件

  • JSR是Java Specification Requests的缩写,意思是Java规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准

  • lombok解析流程如下

    Javac解析成AST抽象语法树后,lombok根据自己编写的注解处理器,动态的修改AST增加新的节点(即lombok自定义注解所需要生成的代码),最终生成JVM可执行的字节码Class文件

  • 能实现上述效果的还有一个反射技术,那两个对比如何?

    • 使用Annotation Processing自定义注解是在编译阶段进行修改
    • JDK反射技术是在运行时动态修改
    • 结论:反射更加灵活但是带来的性能损耗更加大

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

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

相关文章

AI 编译器技术分享会:上海交大/中科院计算所/微软亚研/智源,他们来了!

4 场 Meetup、3 个城市、19 位嘉宾、1k 行业从业者、累计 100w 曝光&#xff0c; 2023 年 AI 编译器社区小小刷新了一下存在感&#xff0c;我们在非常细分的领域里找到了最为垂直的开发者和工程师&#xff0c;从 0 到 1 建立起一个个小据点&#xff0c;搭建交流平台、促成企内合…

求最小生成树的新算法

不管 prim 算法还是 kruskal 算法都基于 “当前可见最短边” 作贪心策略&#xff0c;但这并不适合分布式并行操作&#xff0c;比方说所有节点一起构建最小生成树&#xff0c;这些算法都显得同步开销过大&#xff0c;甚至导出错误的结果。 最近研究并构建最大流多路径传输协议的…

韩顺平0基础学Java——第27天

p548-568 明天开始坦克大战 Entry 昨天没搞明白的Map、Entry、EntrySet&#xff1a;//GPT教的 Map 和 Entry 的关系 1.Map 接口&#xff1a;它定义了一些方法来操作键值对集合。常用的实现类有 HashMap、TreeMap 等。 2. Entry接口&#xff1a;Entry 是 Map 接口的一个嵌…

【高等数学】傅里叶级数

最近刷了会抖音&#xff0c;看到一个非常有趣的现象&#xff1a;傅里叶级数&#xff0c;今天挑了几个视频来供大家学习。 1.傅里叶级数概念 【小崔说数】傅里叶级数专题https://www.bilibili.com/video/BV1Uq4y1q7xk?t117.4 2.傅里叶级数动画 【谜之舒适】12分钟的傅立叶级…

编译原理:语法分析(语法制导翻译)、语义分析(类型检查、中间代码生成)

编译器在做语法分析的过程中&#xff0c;除了回答程序代码的语法是否合法&#xff08;LL,LR能否接收&#xff09;外&#xff0c;还需要完成后续的工作&#xff08;包括构建语法树、类型检查、中间代码生成、目标代码生成&#xff09;&#xff0c;这些后续工作一般都可以通过语法…

国产芯片方案/血氧仪方案SIC88336

血氧仪是用来测量脉率、血氧浓度以及灌注指数的仪器设备&#xff0c;血氧浓度是临床医疗上重要的基础数据之一。如果有条件&#xff0c;人们应该时刻监测自己的血氧饱和度&#xff0c;对自己的健康更加有利。下面是详细知识说明。 一、血氧仪方案开发原理 该方案一种检测方式是…

SOFTS: Efficient Multivariate Time Series Forecasting with Series-Core Fusion

SOFTS: Efficient Multivariate Time Series Forecasting with Series-Core Fusion 文章目录 SOFTS: Efficient Multivariate Time Series Forecasting with Series-Core Fusion1. 论文背景1.1 通道独立-通道依赖的区别1.2 论文贡献 2. 模型架构2.1 SOFTS的主要架构2.2 STAR 模…

家用洗地机哪个牌子的好用性价比高?热销品牌型号推荐

洗地机在市场上越来越受到人们的欢迎&#xff0c;它能够一次性完成吸尘、拖地和清洗的所有步骤&#xff0c;极大地提高了清洁效率&#xff0c;是减轻人们日常清洁负担的优秀家电&#xff0c;为了避免大家盲信挑选机器&#xff0c;我整理了一份洗地机选购指南&#xff0c;帮助大…

基于MATLAB的误码率与信噪比(附完整代码与分析)

目录 一. 写在前面 二. 如何计算误码率 三. 带噪声的误码率分析 3.1 代码思路 3.2 MATLAB源代码及分析 四. 总结 4.1 输入参数 4.2 规定比特长度 4.3 特殊形式比较 一. 写在前面 &#xff08;1&#xff09;本文章主要讨论如何仿真误码率随着信噪比变化的图像 &#…

原子性(juc编程)

原子性 概述&#xff1a;所谓的原子性是指在一次操作或者多次操作中&#xff0c;要么所有的操作全部都得到了执行并且不会受到任何因素的干扰而中断&#xff0c;要么所有的操作都不执行&#xff0c;多个操作是一个不可以分割的整体。 //比如说&#xff1a;你喂你女朋友吃冰淇…

户外LED显示屏的发展历程

户外LED显示屏自其问世以来&#xff0c;经历了显著的发展与变革。其技术不断进步&#xff0c;应用场景逐步扩大&#xff0c;并在广告、信息传播等领域发挥了重要作用。本文将梳理户外LED显示屏的发展历程&#xff0c;重点介绍其技术演进和应用拓展。 早期发展&#xff1a;直插式…

一文带你理清同源和跨域

1、概述 前后端数据交互经常会碰到请求跨域&#xff0c;什么是跨域&#xff0c;为什么需要跨域&#xff0c;以及常用有哪几种跨域方式&#xff0c;这是本文要探讨的内容。 同源策略(英文全称 Same origin policy)是浏览器提供的一个安全功能。同源策略限制了从同一个源加载的…

海外盲盒小程序搭建过程的最大挑战:文化差异与本地化

一、引言 随着全球化的深入发展&#xff0c;跨境电商和海外市场的拓展成为许多企业的重要战略方向。盲盒小程序作为一种新兴的消费模式&#xff0c;也在海外市场展现出巨大的潜力。然而&#xff0c;在海外搭建盲盒小程序并非易事&#xff0c;文化差异与本地化问题是其搭建过程…

计算最大数位-第13届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第87讲。 计算最大数位&…

Qwen2大模型微调入门实战-命名实体识别(NER)任务(完整代码)

Qwen2是通义千问团队最近开源的大语言模型&#xff0c;由阿里云通义实验室研发。 以Qwen2作为基座大模型&#xff0c;通过指令微调的方式做高精度的命名实体识别&#xff08;NER&#xff09;&#xff0c;是学习入门LLM微调、建立大模型认知的非常好的任务。 使用LoRA方法训练&…

MySQL快速安装(mysql8.0.30区别之前yum安装)

目录 一.初始化环境并解压 二.创建程序用户管理 三.修改mysql目录和配置文件的权限 四.修改配置文件 五.设置环境变量&#xff0c;申明/宣告mysql命令便于系统识别 六.初始化数据库 七.设置系统识别&#xff0c;进行操作 八.初始化数据库密码 九.用户并设置密码 十.赋…

机器学习模型评估之校准曲线

模型校准曲线&#xff08;Calibration Curve&#xff09;&#xff0c;也称为可靠性曲线&#xff08;Reliability Curve&#xff09;或概率校准曲线&#xff08;Probability Calibration Curve&#xff09;&#xff0c;是一种评估分类模型输出概率准确性的图形工具。它可以帮助我…

STM32 串口通讯

使用STM32的串口通讯&#xff0c;接收串口助手的数据&#xff0c;并且将接收到的数据返回串口&#xff0c;重定义printf功能。 配置引脚信息 由于每次新建工程都需要配置信息&#xff0c;比较麻烦&#xff0c;好在STM32CubeIDE提供了导入.ioc文件的功能&#xff0c;可以帮我们…

达梦8 兼容MySQL语法支持非分组项作为查询列

MySQL 数据库迁移到达梦后&#xff0c;部分GROUP BY语句执行失败&#xff0c;报错如下&#xff1a; 问题原因&#xff1a; 对于Oracle数据库&#xff0c;使用GROUP BY时&#xff0c;SELECT中的非聚合列必须出现在GROUP BY后面&#xff0c;否则就会报上面的错误&#xff0c;达梦…

基于python+tkinter(Gui)的学生信息管理系统

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…