当前位置: 首页 > news >正文

IDEA中Lombok插件的安装与使用

背景

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

 

 

Lombok简介

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

Lombok使用

 

注解介绍

  下面只是介绍了几个常用的注解,更多的请参见https://projectlombok.org/features/index.html。

@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<? extends Annotation> annotationClass);
<T extends Annotation> T getAnnotation(Class<T> annotationClass);
Annotation[] getAnnotations();
Annotation[] getDeclaredAnnotations();

 

Lombok问题

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

转载于:https://www.cnblogs.com/iathanasy/p/9262689.html

相关文章:

  • python坦克大战_python资料领取:尚学堂201903期python全栈(0基础到就业)
  • 【leetcode】88. 合并两个有序数
  • aix么把占用的端口释放掉_UNIX系统如何释放被异常占用的端口 - 河北分行(秦永峰)...
  • redis 多维度排序_解决Redis Cluster模式下的排序问题
  • python基础学习01
  • 不同平台安装python方式一样_大厦的基石,成为一个Python工程师的第一步——安装Python...
  • vue 多页面应用例子_用vue构建多页面应用
  • 6.7 二分查找
  • oracle手工收集awr报告_oracle手工生成AWR报告方法
  • 《杜拉拉升职记》//TODO
  • php缓存accestoken_php微信开发(1):缓存access_token的方法
  • git 更新代码到本地
  • python subprocess使用_python subprocess使用-阿里云开发者社区
  • tomcat日志神器--kibana
  • python计算相同生日概率_用python计算下一个生日前的天数
  • $translatePartialLoader加载失败及解决方式
  • Go 语言编译器的 //go: 详解
  • js继承的实现方法
  • MD5加密原理解析及OC版原理实现
  • PHP 7 修改了什么呢 -- 2
  • Python利用正则抓取网页内容保存到本地
  • RxJS: 简单入门
  • ubuntu 下nginx安装 并支持https协议
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • vue数据传递--我有特殊的实现技巧
  • WebSocket使用
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 大主子表关联的性能优化方法
  • 服务器之间,相同帐号,实现免密钥登录
  • 开发基于以太坊智能合约的DApp
  • #Linux(make工具和makefile文件以及makefile语法)
  • (1)(1.9) MSP (version 4.2)
  • (6)设计一个TimeMap
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (LeetCode) T14. Longest Common Prefix
  • (接口自动化)Python3操作MySQL数据库
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .jks文件(JAVA KeyStore)
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Core跨平台微服务学习资源
  • .net refrector
  • .NET 中让 Task 支持带超时的异步等待
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .netcore 获取appsettings
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • [C#]winform制作圆形进度条好用的圆环圆形进度条控件和使用方法
  • [C++]Leetcode17电话号码的字母组合
  • [Docker]十一.Docker Swarm集群raft算法,Docker Swarm Web管理工具
  • [Google Guava] 2.1-不可变集合
  • [JavaWeb玩耍日记]Maven的安装与使用