lombok常用注解使用与原理

2024-06-21 14:52

本文主要是介绍lombok常用注解使用与原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是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反射技术是在运行时动态修改
    • 结论:反射更加灵活但是带来的性能损耗更加大

这篇关于lombok常用注解使用与原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1081524

相关文章

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

如何使用Nginx配置将80端口重定向到443端口

《如何使用Nginx配置将80端口重定向到443端口》这篇文章主要为大家详细介绍了如何将Nginx配置为将HTTP(80端口)请求重定向到HTTPS(443端口),文中的示例代码讲解详细,有需要的小伙... 目录1. 创建或编辑Nginx配置文件2. 配置HTTP重定向到HTTPS3. 配置HTTPS服务器

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程