背景

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

Lombok简介

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

Lombok使用

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

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

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.6</version>
</dependency>

注解介绍

  下面只是介绍了几个常用的注解,更多的请参见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问题

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

最新文章

  1. NPOI的操作
  2. 「C++11」Lambda 表达式
  3. 禁止浏览.htaccess文件
  4. java语言一维数组,对象数组
  5. JS获取阴历阳历和星期
  6. 采用get的方式提交数据到服务器
  7. sublime相关设置
  8. A. Fox and Box Accumulation
  9. uva 10056
  10. Hibernate中遇见的问题
  11. 201521123092《java程序设计》第四周学习总结
  12. Ansible系列(二):选项和常用模块
  13. python实例二
  14. app启动过程
  15. android手机短信获取
  16. Image &amp; Raw Image的区别
  17. 由consequence忽然发现英语也挺有意思
  18. Java 反射 调用私有构造方法
  19. 深入浅出的webpack4构建工具--webpack4+vue+vuex+mock模拟后台数据(十九)
  20. 《springCloud系列》——Eureka 进行服务治理

热门文章

  1. 【Oracle】删除手工创建的数据库
  2. C#调用FFMPEG实现桌面录制(视频+音频+生成本地文件)
  3. sql server 游标fetch简单用法
  4. GrepWin:Win7下的文本替换工具
  5. error C3859: 超过了PCH的虚拟内存范围;请使用“-Zm33”或更大的命令行选项重新编译
  6. html 图片翻转
  7. 【转载】jmeter将上一个接口返回值作为下一个接口的请求参数
  8. ivew使用星星评分
  9. dd命令测试IO
  10. Vue push() pop() shift() unshift() splice() sort() reverse() ...