IDEA中使用Lombok插件
发布日期:2021-10-09 15:35:04 浏览次数:1 分类:技术文章

本文共 2858 字,大约阅读时间需要 9 分钟。

转载自: https://blog.csdn.net/qq_18252605/article/details/72875351

背景

  我们在开发过程中,通常都会定义大量的JavaBean,然后通过IDE去生成其属性的构造器、getter、setter、equals、hashcode、toString方法,当要对某个属性进行改变时,比如命名、类型等,都需要重新去生成上面提到的这些方法,那中有没有一种方式能够避免这种重复的劳动呢?答案是有,我们来看一下下面这张图,右面是一个简单的JavaBean,只定义了两个属性,在类上加上了@Data,从左面的结构图上可以看到,已经自动生成了上面提到的方法。 

这里写图片描述

Lombok简介

  Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。官方地址:,github地址:。

Lombok使用

IDEA中添加Lombok插件, File -> Setting -> Plugins 搜索Lombok Plugin, 点击install,安装完成后重启IDEA

在Maven项目的pom.xml中添加配置

org.projectlombok
lombok
1.16.6

注解介绍

  下面只是介绍了几个常用的注解,更多的请参见。

@Getter / @Setter

  可以作用在类上和属性上,放在类上,会对所有的非静态(non-static)属性生成Getter/Setter方法,放在属性上,会对该属性生成Getter/Setter方法。并可以指定Getter/Setter方法的访问级别。

@EqualsAndHashCode

  默认情况下,会使用所有非瞬态(non-transient)和非静态(non-static)字段来生成equals和hascode方法,也可以指定具体使用哪些属性。

@ToString

  生成toString方法,默认情况下,会输出类名、所有属性,属性会按照顺序输出,以逗号分割。

@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor

  无参构造器、部分参数构造器、全参构造器,当我们需要重载多个构造器的时候,Lombok就无能为力了。

@Data

  @ToString, @EqualsAndHashCode, 所有属性的@Getter, 所有non-final属性的@Setter和@RequiredArgsConstructor的组合,通常情况下,我们使用这个注解就足够了。

Lombok原理

  了解了简单的使用之后,现在应该比较好奇它是如何实现的。整个使用的过程中,只需要使用注解而已,不需要做其它额外的工作,那玄妙之处应该是在注解的解析上。JDK5引入了注解的同时,也提供了两种解析方式。

运行时解析

  运行时能够解析的注解,必须将@Retention设置为RUNTIME,这样可以通过反射拿到该注解。java.lang.reflect反射包中提供了一个接口AnnotatedElement,该接口定义了获取注解信息的几个方法,Class、Constructor、Field、Method、Package等都实现了该接口,大部分开发者应该都很熟悉这种解析方式。

boolean isAnnotationPresent(Class
annotationClass);
T getAnnotation(Class
annotationClass);
Annotation[] getAnnotations();
Annotation[] getDeclaredAnnotations();
  • 编译时解析

    编译时解析有两种机制,网上很多文章都把它俩搞混了,分别简单描述一下。

    Annotation Processing Tool

      apt自JDK5产生,JDK7已标记为过期,不推荐使用,JDK8中已彻底删除,自JDK6开始,可以使用Pluggable Annotation Processing API来替换它,apt被替换主要有2点原因:

    • api都在com.sun.mirror非标准包下
    • 没有集成到javac中,需要额外运行

      apt的更多介绍可以参见。

    Pluggable Annotation Processing API

      ,自JDK6加入,作为apt的替代方案,它解决了apt的两个问题,javac在执行的时候会调用实现了该API的程序,这样我们就可以对编译器做一些增强,这时javac执行的过程如下: 

    这里写图片描述 
      Lombok就是使用这种方式实现的,有兴趣的话可以去看看其Lombok源码,对应注解的实现都在HandleXXX中,比如@Getter注解的实现是HandleGetter.handle()。还有一些其它类库使用这种方式实现,比如、等等。

    Lombok问题

    • 无法支持多种参数构造器的重载

    引用

    http://blog.csdn.net/ghsau/article/details/52334762

转载地址:https://blog.csdn.net/qinwuxian19891211/article/details/106023304 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java动态代理模式实现原理及实例
下一篇:springboot+mybatis plus+code generate+mysql + swagger ui简单demo

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年03月12日 17时49分58秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

PHP实现 bcrypt,如何使php中的bcrypt和Java中的jbcrypt兼容 2021-06-24
php8安全,PHP八大安全函数解析 2021-06-24
php基础语法了解和熟悉的表现,PHP第二课 了解PHP的基本语法以及目录结构 2021-06-24
matlab中lag函数用法,MATLAB movavg函数用法 2021-06-24
matlab变形监测,基于matlab的变形监测数据处理与分析_毕业设计论文 2021-06-24
opencv matlab编程,在Matlab中调用OpenCV函数 | 学步园 2021-06-24
c语言文件wt,c语言,wt和rt中的t是什么意思 2021-06-24
c语言运行几进制,【C语言】求已知等式在几进制条件下成立 2021-06-24
电梯运行仿真c语言代码,电梯调度算法模拟(示例代码) 2021-06-24
linux resolv.conf 只读,ubuntu--修改DNS--resolvconf命令 2021-06-24
鸿蒙系统兼容安卓电视软件,华为鸿蒙系统藏玄机?包含完整安卓10系统,无专用APP成硬伤... 2021-06-24
android组件动态接收数据库,Android开发——fragment中数据传递与刷新UI(更改控件)... 2021-06-24
android2.1操作系统,电脑安卓操作系统 2021-06-24
android intent.action_call,java-启动后如何停止intent.ACTION_CALL? 2021-06-24
linux sed 正则转义,转义字符Escape character在正则中的用法 2021-06-24
android camera颠倒,android开发步步为营之112:关于Camera镜像上下左右颠倒问题的解决办法... 2021-06-24
雨滴桌面显示html,如何用雨滴桌面设置美观的桌面天气插件 2021-06-24
html语言是客户端,Web客户端技术:HTML 2021-06-24
HTML5input属性选择文件,HTML 5 <input> type属性 2019-04-21
python遍历queryset_有效使用Django的QuerySets 2019-04-21