Lombok同时使⽤@Data和@Builder踩坑总结

目录
  • 问题背景
  • Lombok @Data和@Builder分别单独分析用法
  • 解决方法
  • Lombok原理
  • 总结

问题背景

Lombok使⽤ 同时使⽤@Data和@Builder ,构建无参构造器报错!编译不通过。如下图:

Lombok @Data和@Builder分别单独分析用法

Lombok使⽤@Data可以⽣成⽆参构造和类⾥⾯所有属性的getter/setter⽅法。可以简化我们代码的开发。(需要安装Lombok插件和引⼊Lombok依赖)。

例如下⾯的⼀个实体类,引⼊Lombok后,可以⾃动⽣成GET/SET⽅法和⽆参构造函数。

编译后的class为:可以看到不仅帮我们生成了get和set ,同时也有默认的无参构造器

那么怎么自动生成有参构造器呢?使用@Builder注解,将会帮助我们⽣成全属性的构造⽅法。

编译后的class为:可以看到 已经帮我们构建好了全属性的构造方法,但是如果值只引用@Builder注解是无法生成get和set的。

但是如果同时使⽤@Data和@Builder的话,可以看出尽管⽣成了GET/SET⽅法,但是⽆参构造⽅法没有了,这显然是不能接受的,因为很多框架都会调⽤⽆参构造去创建对象。

编译后的class: 

我们尝试在Tet1类,⼿动添加⽆参构造⽅法。编译发现报错不通过:

解决方法

Lombok同时使⽤@Data和@Builder的时候,如果要⽣成⽆参构造,需要在代码⾥⾯⼿动引⼊注解@Tolerate,让Lombok在⽣成类的时候,对指定的构造函数不感知

Lombok原理

Java的编译分为以下⼏个阶段:

解析与填充符号表->注解处理->分析与字节码⽣成->⽣成⼆进制class⽂件。

  • Lombok 使⽤的是 JDK 6 实现的 JSR 269: Pluggable Annotation Processing API (编译期的注解处理器),它是在编译期时把 Lombok 的注解代码,转换为常规的 Java ⽅法⽽实现注⼊。
  • 在编译期阶段,当 Java 源码被抽象成语法树 (AST) 之后,Lombok 会根据⾃⼰的注解处理器动态的修改AST,增加新的代码 (节点),在这⼀切执⾏之后,再通过分析⽣成了最终的字节码 (.class) ⽂件,这就是Lombok 的执⾏原理。

可以借助注解处理器实现⼀个简单的 Setter,我们的实现步骤是:

  • ⾃定义⼀个注解标签接⼝,并实现⼀个⾃定义的注解处理器;
  • 利⽤ tools.jar 的 javac api 处理 AST (抽象语法树)3. 使⽤⾃定义的注解处理器编译代码。

1.定义⾃定义注解和注解处理器

⾸先创建⼀个 MySetter.java ⾃定义⼀个注解,代码如下:

再实现⼀个⾃定义的注解处理器,代码如下:

测试类如下:

2.对注解处理器进⾏编译,随后使⽤注解处理器对类进⾏编译

⾸先需要先对注解处理器进⾏编译(javac -cp ⽤于引⼊第三⽅jar包进⾏编译)

然后使⽤注解处理器对这个Person测试类进⾏编译:

这时候再看⽣成的Person.class,可以发现Setter⽅法已经⽣成了:

总结

当然尽管测试类已经⽣成Setter⽅法,但是因为是在编译时期⽣成的,因此我们在开发的时候是没法直接调⽤Setter⽅法的,因此Lombok提供了插件机制,⽅便我们在开发的时候可以直接去调⽤Lombok的特性。

到此这篇关于Lombok同时使⽤@Data和@Builder踩坑总结的文章就介绍到这了,更多相关Lombok @Data和@Builder内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Springboot中使用lombok的@Data注解方式

    目录 Springboot 使用lombok的@Data注解 idea安装lombok插件 创建项目,编写实体类 编写测试类 测试结果 springBoot 注解@Data注入失败 一.Files--Seetings--Plugins 二.如果重启后仍注入失败 Springboot 使用lombok的@Data注解 idea安装lombok插件 点击setting,选择plugins,搜索lombok安装即可. 创建项目,编写实体类 安装好插件后需要重启idea,然后创建一个springboot

  • Lombok中关于@Data的使用解析

    目录 Lombok @Data注解 内部实现 问题总结 解决方法 Lombok的@Data踩坑记录 证明 小结一下 当你在使用 Lombok 的 @Data 注解时,其实会有一些坑需要关注,今天就让我们来见识一下. Lombok 先来简单介绍一下 Lombok ,其官方介绍如下: Project Lombok makes java a spicier language by adding 'handlers' that know how to build and compile simple,

  • Java中lombok的@Builder注解的解析与简单使用详解

    Lombok中@Builder用法 1.建造者模式简介:Builder 使用创建者模式又叫建造者模式.简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程. 2.注解类Builder.java注释: * The builder annotation creates a so-called 'builder' aspect to the class that is annotated or the class  * that contains a mem

  • java中lombok的@Data引发问题详解

    前言 我们问题lombok是可以精简我们的代码的,让开发人员把精力放在业务上,而它封装的注解我们在使用时,需要多注意一下:@Data注解它是一个混合注释,它包含了@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode的功能,而我们问题@EqualsAndHashCode是重写equals和hash的注释,如果你是一个类,那可以不关心它:而如果你的类中有继承(父类子类),那么就要注意一下了. 危险的@Data 子类

  • Lombok的@Data等注解无效的解决

    一.已定义好的实体类 二.调用时没有get,set访问器 在用@Data注解时,没有生成setter/getter方法.百度了一堆都没解决方法,后来用Google查了一下解决了~~~ 使用IDEA需要安装Lombok插件,我这里已经下载好,如果没下载安装点击install进行下载安装即可~~~ 到此这篇关于Lombok的@Data等注解无效的解决的文章就介绍到这了,更多相关Lombok的@Data注解无效内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

  • 聊聊Lombok中的@Builder注解使用教程

    目录 Lombok中的@Builder注解的使用 作用 引入依赖 第二步给实体类加上@Builder注解 第三步使用测试使用@Builder注解生成对象 实体类加上@Builder注解之后的编译结果 Lombok中的@Builder注解的使用 作用 @Builder注解的作用主要是用来生成对象,并且可以为对象链式赋值. 引入依赖 因为@Builder注解是lombok中的东西,所以第一步我们需要引入lombok的依赖,如下图: 第二步给实体类加上@Builder注解 第二步我们需要给我们的实体类

  • Lombok同时使⽤@Data和@Builder踩坑总结

    目录 问题背景 Lombok @Data和@Builder分别单独分析用法 解决方法 Lombok原理 总结 问题背景 Lombok使⽤ 同时使⽤@Data和@Builder ,构建无参构造器报错!编译不通过.如下图: Lombok @Data和@Builder分别单独分析用法 Lombok使⽤@Data可以⽣成⽆参构造和类⾥⾯所有属性的getter/setter⽅法.可以简化我们代码的开发.(需要安装Lombok插件和引⼊Lombok依赖). 例如下⾯的⼀个实体类,引⼊Lombok后,可以⾃动

  • 基于spring data jpa @query返回map的踩坑记录

    目录 spring data jpa @query返回map踩坑记录 设置JPA的Query返回Map对象 spring data jpa @query返回map踩坑记录 最近用spring data jpa,网上看的一些教程,有的说是返回的Object[]数组,有的说是直接返回的对象,亲身验证了一下,发现主要看写法和返回结果. 用的版本是这样的: dao代码如下: public interface UserRepository extends JpaRepository<User, Integ

  • Spring Data JPA踩坑记录(@id @GeneratedValue)

    目录 Spring Data JPA踩坑记录 JPA踩坑:No property xxx found for type xxx 问题发现 问题解决 Spring Data JPA踩坑记录 最近在做自己的一个项目时 使用了spring jpa 由于数据库用的是mysql 在给实体类entity 的id给注解时@Id遇到了一个坑 自己找了许久才在stackoverflow 上找到了答案 注意 再查询数据库的时候并不会因此报错 而当你的主键是自增的时候 在添加数据的时候就会报错了 看看我们的实体类 注

  • SQL Server在AlwaysOn中使用内存表的“踩坑”记录

    前言 最近因为线上alwayson环境的一个数据库上使用内存表.经过大概一个星期监控程序发现了一个非常严重问题这个数据库的日志文件不会截断,已用空间一直在增加(存在定时的每个小时的日志备份),同时内存表数据库文件也无法删除,下面就介绍一下后面我的处理过程,话不多说了,来一起看看详细的介绍吧. 数据库:SQL Server2014 Enterprise Edition (64-bit) 删除文件 使用一个单独非alwayson环境的数据库测试. 一.创建内存表 ---创建内存表文件组 ALTER

  • mpvue开发音频类小程序踩坑和建议详解

    这是我第一次开发小程序,开发的产品是音频类的,在大佬的建议下采用了 mpvue ,一周时间把功能都做出来,由于不太熟悉mpvue和微信小程序,足足用了一周时间来改bug才出来一个能用的版本,在这里整理分享下我开发时遇到的一些问题和给出一些建议. 在 Linux 上开发小程序 在公司电脑装了双系统,日常用的是 Ubuntu 系统,Linux或Mac的开发环境对前端相对来说会友好一些.微信小程序官方的开发者工具只有 Windows 和 Mac 版本,所以这就尴尬了. 不过还好,发现已经有大神在Git

  • 浅谈Mybatis版本升级踩坑及背后原理分析

    1.背景 某一天的晚上,系统服务正在进行常规需求的上线,因为发布时,提示统一的pom版本需要升级,于是从 1.3.9.6 升级至 1.4.2.1. 当服务开始上线后,开始陆续出现了一些更新系统交互日志方面的报警,属于系统辅助流程,报警下图所示, 具体系统数据已脱敏,内容是Mybatis相关的报警,在进行类型转换的时候,产生了强转错误. 更新开票请求返回日志, id:{#######}, response:{{"code":XXX,"data":{"call

  • Vant Weapp组件踩坑:picker的初始赋值解决

    在使用vant的picker组件时,我希望有在页面加载时向数据库获取值来设置picker的默认值.开始我使用官方文档中的default-index属性,并在onLoad方法中进行this.setData().但是这样做picker的默认索引还是0. 于是我又将setData放入onShow().onReady()方法,均不奏效.(我真的不知道为什么,新建一个空白页面测试也是这样) 继而我查看官方文档,发现picker有实例方法setIndexes(),于是尝试. 然而我在onLoad().onR

  • vite2.0 踩坑实录

    目录 vite项目构建优化 其它 最后 算是对上一篇的补充,记录了一些在配置项目中遇到的问题,希望对大家能有所帮助- vite项目构建优化 路由动态导入 经过rollup的构建,动态导入的文件将会生成异步的chunk文件,在我们访问项目的时候按需加载,极大的提升应用的加载速度 import Home from '@/views/home/index.vue' import Layout from '@/components/Layout.vue' const routes: Array<Rout

  • npm踩坑问题实战记录

    目录 一.npm安装依赖失败问题 二.npmlockfile报错 三.npmERR!codeEPERM问题 四.npmERR!codeEEXIST(文件已存在,拒绝删除) 补充:通过npm命令来删除node_modules文件夹 总结 悲催的我基本上问题都遇到了...... 一.npm安装依赖失败问题 问题描述: 错误信息: unbuild: sill gentlyRm target.inParent = false 后续会出现长时间停留 问题解决:删除整个node_modules,重新npm

随机推荐