学习使用Lombok生成代码
一、介绍
Lombok官网:https://projectlombok.org/
Lombok的功能简单一点说,就是可以帮我们生成一些代码,这些代码并不是在源码(source code)体现出来的,而是在字节码文件中。
比如我们创建一个简单的pojo,需要生成有参构造函数、无参构造函数、getter、setter、toString、hashCode、equals这些个方法,虽然通过IDE也是可以生成代码的,但是,利用IDE生成的代码有个问题:代码量大、如果修改属性名后,这些方法基本都得重新生成,不咋方便。
Lombox的功能:可以为我们生成上面说的那些方法,只需要我们在类名上使用相关注解即可。
二、导入jar包
这里使用Maven来导入依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency>
注意,maven引入依赖是,scope是provided,也就是说,lombok包在运行时是不需要的,主要是在编译的时候使用。
三、创建简单pojo
这里举个简单的示例,就创建一个Person类:
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString; // 注意下面使用的几个注解,都是Lombok提供的
@NoArgsConstructor
@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class Person { // 创建三个属性
private Integer id;
private String name;
private String addr; // 没有使用IDE进行代码生成,编译源码时,Lombok会自动在字节码中生成方法(前面注解指定的那些方法)
}
生成的代码如下:
public class Person {
private Integer id;
private String name;
private String addr;
public Person() {
}
public Person(final Integer id, final String name, final String addr) {
this.id = id;
this.name = name;
this.addr = addr;
}
public String toString() {
return "Person(id=" + this.id + ", name=" + this.name + ", addr=" + this.addr + ")";
}
public boolean equals(final Object o) {
// 会调用下面canEqual方法
}
protected boolean canEqual(final Object other) {
return other instanceof Person;
}
public int hashCode() {
// 计算出hashCode
}
}
四、Lombok常用的注解
下面是Lombok常用的注解:
@NoArgsConstructor // 生成无参构造函数
@AllArgsConstructor // 生成包含所有属性的有参构造函数
@ToString // 生成toString方法
@EqualsAndHashCode // 生成equals和hashCode方法
@Getter // 为所有字段生成getter
@Setter // 为所有字段生成setter
@Data // 等价于 @NoArgsConstructor + @Getter + @Setter + @EqualsAndHashCode + @ToString
@Slf4j // 自动生成log对象
@Builder // 生成Builder代码(非Builder设计模式)
五、进行测试
创建测试类:
package cn.ganlixin.pojo;
import org.junit.Test;
public class TestPerson {
@Test
public void testCreatePerson() {
// 虽然IDE提示下面的构造函数有错误,但是执行的时候,并不会报错,而是会正常运行
Person person = new Person(1, "ganlixin", "beijing");
System.out.println(person);
// 输出 Person(id=1, name=ganlixin, addr=beijing)
// 说明有参构造函数和toString方法已经生成了
}
}
六、解决IDEA提示Lombok生成方法未定义的问题
6.1、问题描述
因为我们在使用Lombok的时候,Lombok为我们生成的代码是在字节码中(*.class),而不是在source code中,所以存在IDE提示Lombok生成的方法未定义的错误,导致项目不能正常编译,但是我们都知道,这是没问题的,只是IDE的问题。
比如,使用@Setter来注解一个类的时候,我们可以免于手动写或者利用IDE生成每个属性的Setter方法,因为Lombok会为在编项目的时候,扫描到@Setter方法,就会在字节码中为属性生成setter方法。但是,我们在代码中调用一个该类实例对象的setter方法的时候,IDE就会提示没有定义该方法,其实IDE也没有错,只是他不是根据字节码中的方法来判断的。
6.2、IDEA插件库安装
步骤:打开IDEA --> 打开Preferences --> 选择Plugins,如下图

安装Lombok插件后,重启IDEA即可。
6.3、下载插件安装(针对IDEA)
如果在插件库中没有搜到Lombok,可以去通过本地安装的方式,按照下面的步骤进行操作:
地址:https://github.com/mplushnikov/lombok-intellij-plugin/releases
根据版本下载一个zip包即可。
启动IDEA,打开preferences,建议在IDEA的启动界面打开preferences进行设置,因为这样设置后是全局的,每个项目都可以使用。

选择Plugins

打开右边的设置,选择Install Plugin from Disk
然后选择第一步下载的zip包,点击确认即可。

进入到Plugins,重启IDEA即可
点击Installed,可以看到上一步安装的Lombok插件

学习使用Lombok生成代码的更多相关文章
- 解决IDEA中Lombok生成代码后提示错误的问题
一.背景介绍 因为我们在使用Lombok的时候,Lombok为我们生成的代码是在字节码中(*.class),而不是在source code中,所以存在IDE提示Lombok生成的方法未定义的错误,导致 ...
- ASP.NET MVC 5 学习教程:生成的代码详解
原文 ASP.NET MVC 5 学习教程:生成的代码详解 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 ...
- (转)MyBatis框架的学习(七)——MyBatis逆向工程自动生成代码
http://blog.csdn.net/yerenyuan_pku/article/details/71909325 什么是逆向工程 MyBatis的一个主要的特点就是需要程序员自己编写sql,那么 ...
- [goa]golang微服务框架学习(二)-- 代码自动生成
之前用过go语言的反射来做一些代码生成,参考这篇. 但是这种方式,入侵太强,需要执行对应的申明调用, 所以对GOA框架的自动生成非常感兴趣,于是仔细研究了一下,发现用的比较巧妙, 这里先卖个关子,先看 ...
- springboot学习随笔(四):Springboot整合mybatis(含generator自动生成代码)
这章我们将通过springboot整合mybatis来操作数据库 以下内容分为两部分,一部分主要介绍generator自动生成代码,生成model.dao层接口.dao接口对应的sql配置文件 第一部 ...
- 【MyBatis学习15】MyBatis的逆向工程生成代码
1. 什么是逆向工程 mybatis的一个主要的特点就是需要程序员自己编写sql,那么如果表太多的话,难免会很麻烦,所以mybatis官方提供了一个逆向工程,可以针对单表自动生成mybatis执行所需 ...
- 前端学习笔记系列一:7 在vscode中根据vue等模板生成代码
目标:希望每次新建.vue文件后,VSCODE能够根据配置,自动生成我们想要的内容. 方法:打开VSCODE编辑器,依次选择“文件 -> 首选项 -> 用户代码片段”,此时,会弹出一个搜索 ...
- java版gRPC实战之一:用proto生成代码
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Android注解使用之通过annotationProcessor注解生成代码实现自己的ButterKnife框架
前言: Annotation注解在Android的开发中的使用越来越普遍,例如EventBus.ButterKnife.Dagger2等,之前使用注解的时候需要利用反射机制势必影响到运行效率及性能,直 ...
随机推荐
- Linux正则表达式、shell基础、文件查找及打包压缩
Linux正则表达式.shell基础.文件查找及打包压缩 一.正则表达式 Linux正则表达式分为2类: 1.基本正则表达式(BRE) 2.扩展正则表达式(ERE) 两者的区别: 1.使用扩展正则表达 ...
- C++(四十八) — string容器的基本操作
参考博客:https://blog.csdn.net/qq_37941471/article/details/82107077 https://www.cnblogs.com/danielStudy/ ...
- 微信小程序~项目步骤和流程
从运营的角度讲制作,不是从程序的角度讲开发,所以简单明晰,通俗易懂,小白也能按照流程完成制作. 微信小程序制作步骤及流程 1.确定好微信小程序的的定位和目的 如行业,功能,内容,目标用户,目标市场,意 ...
- 云服务器CentOS7.4下搭建GitLab
一.Git.GitHub.GitLab的区别 Git是版本控制系统,Github是在线的基于Git的代码托管服务. GitHub是2008年由Ruby on Rails编写而成.GitHub同时提供付 ...
- C#WinForm无边框窗体移动----模仿鼠标单击标题栏移动窗体位置
C#WinForm无边框窗体移动方法.模仿鼠标单击标题栏移动窗体位置 这里介绍俩种办法 方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务 ...
- 树莓派 Linux 系统命令行快捷键
刚入门树莓派时,在 Linux 下使用命令操作的时候,光标的移动令人头痛.命令输入完了,执行之后发现缺少权限,然后不得不移动光标到行首加 sudo,而命令又极长……当我学会了命令行相关的快捷键之后,不 ...
- jpa之No property buyerOpenId found for type OrderMaster! Did you mean 'buyerOpenid'?
java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.conte ...
- hdu2643&&hdu2512——斯特林数&&贝尔数
hdu2643 题意:$n$ 个人的排名情况数($n \leq 100$) 分析:考虑 $n$ 个有区别的球放到 $m$ 个有区别的盒子里.无空盒的方案数为 $m!\cdot S(n, m)$. 这题 ...
- dbt 0.14.0 发布
以下内容来自官方博客,新的功能还是很不错的,后边尝试使用下. 参考资料:https://blog.fishtownanalytics.com/dbt-v0-14-0-better-serving-ou ...
- xamarin/xamarin.forms 在锁屏电源唤醒时保持后台运行
PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的. SCREEN_DIM_WAKE_LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯 SCRE ...