今天看到有代码中的Dao包中的类文件,写的极其简洁,甚至引起了开发工具InteliJ的报错,然后程序还能稳健地跑起来。

import lombok.Data;

@Data
public class VaildCode { private String code;
private long expTime; }

原来是这个类加了@Data注解,所有Java代码中不需要生成getters and setters,而在编译的时候会自动生成getters and setters

点击导入的包,查看到如下

查看到pom.xml文件中,对应的依赖是

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency> 常用的注解如下==

lombok

https://projectlombok.org/

工作的原理分析,以Oracle的javac编译工具为例。
自从Java 6起,javac就支持“JSR 269 Pluggable Annotation Processing API”规范,只要程序实现了该API,就能在javac运行的时候得到调用。
举例来说,现在有一个实现了”JSR 269 API”的程序A,那么使用javac编译源码的时候具体流程如下:

javac对源代码进行分析,生成一棵**抽象语法树(AST) **
运行过程中调用实现了”JSR 269 API”的A程序
此时A程序就可以完成它自己的逻辑,包括修改第一步骤得到的抽象语法树(AST)
javac使用修改后的抽象语法树(AST)生成字节码文件

所以lombok本质上就是这样的一个实现了”JSR 269 API”的程序。在使用javac的过程中,结合官方说明,它编译的流程如下:

javac对源代码进行分析,生成一棵**抽象语法树(AST)****
运行过程中调用实现了”JSR 269 API”的lombok程序
此时lombok就对第一步骤得到的AST进行处理,找到@Data注解所在类对应的语法树(AST),然后修改该语法树(AST),增加getter和setter方法定义的相应树节点
javac使用修改后的抽象语法树(AST)生成字节码文件

优点:

能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率
让代码变得简洁,不用过多的去关注相应的方法
属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等

缺点:

不支持多种参数构造器的重载
虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度

lombok的实现:就是元注解出现后注解运行生命周期里面的编译周期,这个就是 JSR 269 Pluggable Annotation Processing API,就是源代码在编译成字节码的时候修改了语法树的节点规则进行了加强生成,
以后可以更加快捷的敲代码了。

知乎上对lombok插件得看法也两极化,有人觉得简化代码,阅读代码更舒适;也有人极其反对

只能说爱用不用,不用别诋毁。别人用了至少你要看得懂。

												

lombok 中的@Data注解的更多相关文章

  1. Spring Boot中Spring data注解的使用

    文章目录 Spring Data Annotations @Transactional @NoRepositoryBean @Param @Id @Transient @CreatedBy, @Las ...

  2. Lombok中关于@Data的使用

    当你在使用 Lombok 的 @Data 注解时,其实会有一些坑需要关注,今天就让我们来见识一下. Lombok 先来简单介绍一下 Lombok ,其官方介绍如下: Project Lombok ma ...

  3. lombok中的@ToString注解作用

    Lombok是一个很好的工具,节省了很多重写方法,而@ToString就是节省了ToString方法,lombok中@ToString就是节省了我们在模型中的冗余代码下面就来举个例子 import j ...

  4. Lombok中的@Builder注解

    1.前言 今天在看项目代码的时候, 遇到了实体类上加@Builder注解, 之前在开发的时候, 一直没有用过这个注解, 便兴致勃勃地去查了一下资料, 它也是Lombok中的注解, 我们都知道Lombo ...

  5. lombok标签之@Data @AllArgsConstructor @@NoArgsConstructor -如何去除get,set方法。@Data注解和如何使用,lombok

    在代码中我们可以只加上标签@Data 而不用get,set方法: val : 和 scala 中 val 同名, 可以在运行时确定类型; @NonNull : 注解在参数上, 如果该类参数为 null ...

  6. 继承关系中子类使用@Data注解问题

    HashSet中使用@Data注解问题 平时习惯使用lombok工具,免去了我们写get.set方法之类的,当然了,我们使用@Data注解后,equals().hashCode().toString( ...

  7. 项目实体类使用@Data注解,但是项目业务类中使用getA(),setA()方法报错,eclipse中配置lombok

    @Data注解来源与Lombok,可以减少代码中大量的set get方法,大量减少冗余代码,但是今天部署项目时候,发现实体类使用@Data注解,但是项目业务类中使用getA(),setA()方法报错. ...

  8. Lombok中@Data注解的坑

    开发遇到@Data注解的大坑 如果使用@Data注解,会默认重写hashcode和equals方法 那会遇到什么问题呢? 比如说: @Data public class DataTest { priv ...

  9. @Data 注解引出的 lombok 小辣椒

    今天在看代码的时候, 看到了这个注解, 之前都没有见过, 所以就查了下, 发现还是个不错的注解, 可以让代码更加简洁. 这个注解来自于 lombok,lombok 能够减少大量的模板代码,减少了在使用 ...

随机推荐

  1. MVC杂碎笔记

    MVC页面中@相当于aspx中的<%%>一样,@后面可以写代码的,一般用来放变量的 --  在Controller中方法的前面加[HttpGet]表示该方法只处理http的 GET 请求, ...

  2. C# 查看所有的隐藏文件

    方法1 通过 位与 static void Main(string[] Args)        { //假设扫描C:\Test中—— string[] hiddenfiles = Directory ...

  3. SQL Server 公用表表达式(CTE)实现递归的方法

    公用表表达式简介: 公用表表达式 (CTE) 可以认为是在单个 SELECT.INSERT.UPDATE.DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集.CTE 与派生表类 ...

  4. sql 事务运用实例

    ------------------------------ create proc SaveFinancialProduct@FinancialName nvarchar(50),--产品名称@Yi ...

  5. Object-C-Foundation-NSNuber

    NSNumber 是一个数值类型封装起来的数值. 装箱:基础类型->对象类型 NSNumber *number=[NSNumber numberWithInt:12]; 拆箱:对象类型-> ...

  6. Intro to Python for Data Science Learning 3 - functions

    Functions from:https://campus.datacamp.com/courses/intro-to-python-for-data-science/chapter-3-functi ...

  7. 排序-----插入排序(python版)

    直接插入排序的算法思路: (1) 设置监视哨r[0],将待插入纪录的值赋值给r[0]: (2) 设置开始查找的位置j: (3) 在数组中进行搜索,搜索中将第j个纪录后移,直至r[0].key≥r[j] ...

  8. mvn deploy 推送到私有仓库,注意当前日期

    由于更改了本机系统时间到过去的一个时间,导致mvn deploy推送到私有仓库后,该更新的jar包时间戳比较旧,客户端不能更新得到新的jar包.

  9. RocketMQ事务消费和顺序消费详解

    一.RocketMq有3中消息类型 1.普通消费 2. 顺序消费 3.事务消费 顺序消费场景 在网购的时候,我们需要下单,那么下单需要假如有三个顺序,第一.创建订单 ,第二:订单付款,第三:订单完成. ...

  10. JavaScript中几种 获取元素的方式

    1.根据id获取元素 document.getElementById("id属性的值"); 2.根据标签名字获取元素 document.getElementsByTagName(& ...