引入相应的maven包

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>

Lombok的scope=provided,说明它只在编译阶段生效,不需要打入包中。事实正是如此,Lombok在编译期将带Lombok注解的Java文件正确编译为完整的Class文件。

IDEA添加对Lombok的支持

点击File-- Settings设置界面,安装Lombok插件

点击File-- Settings设置界面,开启Annocation Processors

开启该项是为了让Lombok注解在编译阶段起到作用。

Eclipse的Lombok插件安装可以自行百度,也比较简单,最好在官方下载最新版,网上有些版本可能会导致eclipse出现莫名其妙错误。

 Lombok实现原理

自从Java 6起,javac就支持“JSR 269 Pluggable Annotation Processing API”规范,只要程序实现了该API,就能在javac运行的时候得到调用。

Lombok就是一个实现了"JSR 269 API"的程序。在使用javac的过程中,它产生作用的具体流程如下:

  1. javac对源代码进行分析,生成一棵抽象语法树(AST)

  2. javac编译过程中调用实现了JSR 269的Lombok程序

  3. 此时Lombok就对第一步骤得到的AST进行处理,找到Lombok注解所在类对应的语法树(AST),然后修改该语法树(AST),增加Lombok注解定义的相应树节点

  4. javac使用修改后的抽象语法树(AST)生成字节码文件

 Lombok注解的使用

POJO类常用注解:

@Getter/@Setter: 作用类上,生成所有成员变量的getter/setter方法;作用于成员变量上,生成该成员变量的getter/setter方法。可以设定访问权限及是否懒加载等。

 package com.trace;

 import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter; /**
* Created by Trace on 2018/5/19.<br/>
* DESC: 测试类
*/
@SuppressWarnings("unused")
public class TestClass { public static void main(String[] args) { } @Getter(value = AccessLevel.PUBLIC)
@Setter(value = AccessLevel.PUBLIC)
public static class Person {
private String name;
private int age;
private boolean friendly;
} public static class Animal {
private String name;
private int age;
@Getter @Setter private boolean funny;
} }

在Structure视图中,可以看到已经生成了getter/setter等方法

编译后的代码如下:[这也是传统Java编程需要编写的样板代码]

 //
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
// package com.trace; public class TestClass {
public TestClass() {
} public static void main(String[] args) {
} public static class Animal {
private String name;
private int age;
private boolean funny; public Animal() {
} public boolean isFunny() {
return this.funny;
} public void setFunny(boolean funny) {
this.funny = funny;
}
} public static class Person {
private String name;
private int age;
private boolean friendly; public Person() {
} public String getName() {
return this.name;
} public int getAge() {
return this.age;
} public boolean isFriendly() {
return this.friendly;
} public void setName(String name) {
this.name = name;
} public void setAge(int age) {
this.age = age;
} public void setFriendly(boolean friendly) {
this.friendly = friendly;
}
}
}

@ToString:作用于类,覆盖默认的toString()方法,可以通过of属性限定显示某些字段,通过exclude属性排除某些字段。

@EqualsAndHashCode:作用于类,覆盖默认的equals和hashCode

@NonNull:主要作用于成员变量和参数中,标识不能为空,否则抛出空指针异常。

@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor:作用于类上,用于生成构造函数。有staticName、access等属性。

staticName属性一旦设定,将采用静态方法的方式生成实例,access属性可以限定访问权限。

@NoArgsConstructor:生成无参构造器;

@RequiredArgsConstructor:生成包含final和@NonNull注解的成员变量的构造器;

@AllArgsConstructor:生成全参构造器。

编译后结果

 public static class Person {
@NonNull
private String name;
private int age;
private boolean friendly; public String toString() {
return "TestClass.Person(name=" + this.getName() + ", age=" + this.getAge() + ")";
} @NonNull
public String getName() {
return this.name;
} public int getAge() {
return this.age;
} public boolean isFriendly() {
return this.friendly;
} public void setName(@NonNull String name) {
if(name == null) {
throw new NullPointerException("name");
} else {
this.name = name;
}
} public void setAge(int age) {
this.age = age;
} public void setFriendly(boolean friendly) {
this.friendly = friendly;
} private Person() {
} private static TestClass.Person of() {
return new TestClass.Person();
} @ConstructorProperties({"name"})
Person(@NonNull String name) {
if(name == null) {
throw new NullPointerException("name");
} else {
this.name = name;
}
} @ConstructorProperties({"name", "age", "friendly"})
public Person(@NonNull String name, int age, boolean friendly) {
if(name == null) {
throw new NullPointerException("name");
} else {
this.name = name;
this.age = age;
this.friendly = friendly;
}
}
}

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

@Builder:作用于类上,将类转变为建造者模式

@Log:作用于类上,生成日志变量。针对不同的日志实现产品,有不同的注解

其他重要注解:

@Cleanup:自动关闭资源,针对实现了java.io.Closeable接口的对象有效,如:典型的IO流对象

编译后结果如下:

@SneakyThrows:可以对受检异常进行捕捉并抛出,可以改写上述的main方法如下

@Synchronized:作用于方法级别,可以替换synchronize关键字或lock锁,用处不大

原文作者:LiWenD正在掘金

原文地址:https://juejin.im/post/5b00517cf265da0ba0636d4b

Idea使用Lombok简化实体类代码的更多相关文章

  1. netbeans中实体类代码的bug

    用了netbeans中实体类代码后,忽然报错: com.sun.tools.javac.code.Symbol$CompletionFailure: 找不到sun.util.logging.Platf ...

  2. EA生成实体类代码

    引言 在做机房个人版重构的时候,就听说了EA是一个强大的软件.仅仅只是知道的时候,已经画完了图,没有怎么用EA其它的功能,所以一直没有见识过罢了.如今到了机房合作了,想到EA一定要好好用,这样能省不少 ...

  3. lombok注解简化实体类getting 和 setting 方法

    实体类注解,将以往的get/set方法简化为标签注解,让代码看着更简洁. Maven依赖: <dependency> <groupId>org.projectlombok< ...

  4. IDEA中使用Lombok插件简化实体类的编写

    版本:IDEA Community 2019.2.2 流程:安装lombok插件并安装,重启=>在pom文件中加入 <dependency> <groupId>org.p ...

  5. idea 2018 配置lombok插件及使用lombok设置实体类的getter和setter

    内容简介 本文主要介绍Idea 2018中安装lombok插件,以及lombok的简单使用(生成实体类的getter和setter). lombok插件配置方法 Step 1: 打开Settings窗 ...

  6. SpringBoot整合Mybatis 使用generator自动生成实体类代码、Mapper代码、dao层代码

    1.新建一个SpringBoot项目,并引入Mybatis和mybatis-generator相关的依赖. <dependency> <groupId>org.springfr ...

  7. 使用Lombok简化你的代码

    一.安装 eclipse 下载:https://projectlombok.org/       双击安装即可. 重启eclipse/myeclipse         如果有报错,clean一下项目 ...

  8. java开发笔记——表映射实体类代码示例

    package com.special.ipmsdm; import java.io.Serializable; import javax.persistence.Column; import jav ...

  9. Mybatis系列(二):优化MyBatis配置文件中的配置和解决字段名与实体类属性名不相同的冲突

    原文链接:http://www.cnblogs.com/xdp-gacl/p/4264301.html     http://www.cnblogs.com/xdp-gacl/p/4264425.ht ...

随机推荐

  1. Redis 常用命令学习一:通用的基本命令

    1-链接,如果需要的 Redis 部署在远程机器上,可以通过以下命令链接,其中-h后面跟着主机名,-p后面跟端口名 redis-cli -h 233.2.2.4 -p 666 2-PING 命令用来测 ...

  2. Python解Leetcode: 226. Invert Binary Tree

    leetcode 226. Invert Binary Tree 倒置二叉树 思路:分别倒置左边和右边的结点,然后把根结点的左右指针分别指向右左倒置后返回的根结点. # Definition for ...

  3. Spring4学习回顾之路12-事务

    事务:事务就是一系列的动作,它们被当做一个单独的工作单元,这些动作要么全部完成,要么全部不起作用:事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性.事务的四个关键属性(ACI ...

  4. python — 协程

    1. 协程 1.1 协程基础 1.协程 :能够在一个线程下的多个任务之间来回切换,那么每一个任务都是一个协程. 2.协程的优点: 1.一个线程中的阻塞都被其他的各种任务沾满了 2.让操作系统觉得这个线 ...

  5. redis集群搭建及一些问题

    redis 1.简化版redis (本套Redis集群为简化版安装部署,只需解压至普通用户家目录下或者任意目录,解压后修改脚本,执行脚本后即可使用.) 注意,此版本需要在redis配置文件中添加 pr ...

  6. VSFTP添加用户

    VSFTPD的安装网上有很多教程这里就不多说了,这里主要是针对做主机空间服务的朋友在安装好vsftpd后如何为用户增加ftp账号 先来看一看我们一般在*inux系统下面如何增加用户的 #adduser ...

  7. 采样方法(二)MCMC相关算法介绍及代码实现

    采样方法(二)MCMC相关算法介绍及代码实现 2017-12-30 15:32:14 Dark_Scope 阅读数 10509更多 分类专栏: 机器学习   版权声明:本文为博主原创文章,遵循CC 4 ...

  8. javascript——onsubmit和onreset事件 和开发中常用的方式

    <head> <meta charset="UTF-8"> <title></title> <script> funct ...

  9. 阅读文章《DDD 领域驱动设计-如何 DDD?》的阅读笔记

    文章链接: https://www.cnblogs.com/xishuai/p/how-to-implement-ddd.html 文章作者: 田园里的蟋蟀 首先感谢作者写出这么好的文章. 以下是我的 ...

  10. css文本超出隐藏 显示三个点

    文本超出显示三个点一般分两种情况 一,单行文本超出隐藏 overflow:hidden; text-overflow:ellipsis; white-space:nowrap; 二,多行文本超出隐藏 ...